Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

停止中プロセスがシグナルを 受け取ると? 9

Slide 10

Slide 10 text

$ sleep 100 Terminated $ 10 $ ps u | grep [s]leep ozuma 15631 ... pts/2 S+ 11:47 0:00 sleep 100 $ kill -TERM 15631

Slide 11

Slide 11 text

停止中のプロセスへのシグナルは保留される 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を押す

Slide 12

Slide 12 text

停止中のプロセスへのシグナルは保留される 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 フォアグラウンドに戻したら死んだ

Slide 13

Slide 13 text

意外とハマることがあるので気をつけましょう 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

Slide 14

Slide 14 text

正しいプロセスの殺し方 14

Slide 15

Slide 15 text

一般的に、この順が良い(諸説あり) 1. kill -TERM <プロセスID> 2. kill -HUP <プロセスID> (再起動だけすることも) 3. kill -INT <プロセスID> (Ctrl+cに相当) 4. kill -KILL <プロセスID> (絶対死ぬ) 15 ※この他に、止まっているように見えるだけなら kill -CONT も試そう

Slide 16

Slide 16 text

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 キレイに死んだ

Slide 17

Slide 17 text

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 汚く死んだ (=後始末せずにプロセスが落ちた) ● 一時ファイルが残っているかも ● ファイルが書きかけかも ● ファイルが不整合を起こしているかも

Slide 18

Slide 18 text

プロセスを殺すときは なるたけキレイに殺しましょう 18 削除 削除 削除......