Pro Yearly is on sale from $80 to $50! »

Linuxのシグナルとkillコマンド

 Linuxのシグナルとkillコマンド

「新しいLinuxの教科書」を読む会 オンライン #6 での発表資料です。
https://linuxbook.connpass.com/event/192158/

246b59bbea7c40cbbbcbf94bfc6720ff?s=128

Osumi, Yusuke

October 24, 2020
Tweet

Transcript

  1. Linuxのシグナルと killコマンド @ozuma5119 1 「新しいLinuxの教科書」を読む会 オンライン #6 2020/10/24

  2. 新しいLinuxの教科書: Chapter10 2 killコマンドは、「プロセスを殺す」コマンドでは無い! (確かにそのために使うことは多いが)

  3. 3 $ man kill $ man 2 kill (システムコール)

  4. シグナル (信号) #とは 4 プロセス実行....

  5. シグナル (信号) #とは 5 プロセス実行.... びゅん SIGTERM(15)

  6. シグナル (信号) #とは 6 プロセス実行.... ガッ SIGTERM(15)

  7. シグナル (信号) #とは 7 プロセス実行.... ガッ SIGTERM(15) 突然の割り込み!!

  8. シグナル (信号) #とは 8 プロセス実行.... ガッ SIGTERM(15) ひとことで プロセスにメッセージを送る しくみ

    プロセス間通信(IPC) IPCの他の例:パイプ、UNIXドメインソケット、共 有メモリ、など 送るもの メッセージ ※実際にはシグナル番号だけ (15など) 何ができるか 事象発生をプロセスに伝える (ハードウェアエ ラー、終了命令、タイマー割込など )
  9. 停止中プロセスがシグナルを 受け取ると? 9

  10. $ sleep 100 Terminated $ 10 $ ps u |

    grep [s]leep ozuma 15631 ... pts/2 S+ 11:47 0:00 sleep 100 $ kill -TERM 15631
  11. 停止中のプロセスへのシグナルは保留される 11 $ sleep 100 ^Z [1]+ Stopped sleep 100

    $ $ ps u | grep [s]leep ozuma 15692 ... pts/2 T 11:51 0:00 sleep 100 $ kill -TERM 15692 $ ps u | grep [s]leep ozuma 15692 ... pts/2 T 11:51 0:00 sleep 100 15692!? 爆破したはずでは……!? Ctrl+Zを押す
  12. 停止中のプロセスへのシグナルは保留される 12 $ sleep 100 ^Z [1]+ Stopped sleep 100

    $ fg sleep 100 Terminated $ ps u | grep [s]leep ozuma 15692 ... pts/2 T 11:51 0:00 sleep 100 $ kill -TERM 15692 $ ps u | grep [s]leep ozuma 15692 ... pts/2 T 11:51 0:00 sleep 100 フォアグラウンドに戻したら死んだ
  13. 意外とハマることがあるので気をつけましょう https://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html While a process is stopped, no more signals

    can be delivered to it until it is continued, except SIGKILL signals and (obviously) SIGCONT signals. The signals are marked as pending, but not delivered until the process is continued. プロセス停止中(STOP)の状態では、SIGKILLとSIGCONT以外のシグナルは 保留(pending)となります。実行状態に戻ったとき(continued)、シグナルが配送 されます。 13
  14. 正しいプロセスの殺し方 14

  15. 一般的に、この順が良い(諸説あり) 1. kill -TERM <プロセスID> 2. kill -HUP <プロセスID> (再起動だけすることも)

    3. kill -INT <プロセスID> (Ctrl+cに相当) 4. kill -KILL <プロセスID> (絶対死ぬ) 15 ※この他に、止まっているように見えるだけなら kill -CONT も試そう
  16. kill -TERM と kill -KILL の違い (SIGTERM) Oct 24, 2020

    2:09:35 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 3012 ms Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-bio-8080"] Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["ajp-bio-8009"] Oct 24, 2020 2:09:48 AM org.apache.catalina.core.StandardService stopInternal INFO: Stopping service Catalina Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["http-bio-8080"] Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol stop INFO: Stopping ProtocolHandler ["ajp-bio-8009"] Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["http-bio-8080"] Oct 24, 2020 2:09:48 AM org.apache.coyote.AbstractProtocol destroy INFO: Destroying ProtocolHandler ["ajp-bio-8009"] 16 ここで kill -TERM キレイに死んだ
  17. kill -TERM と kill -KILL の違い (SIGKILL) Oct 24, 2020

    2:09:35 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 3012 ms (何もログ出ない) 17 ここで kill -KILL 汚く死んだ (=後始末せずにプロセスが落ちた) • 一時ファイルが残っているかも • ファイルが書きかけかも • ファイルが不整合を起こしているかも
  18. プロセスを殺すときは なるたけキレイに殺しましょう 18 削除 削除 削除......