KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

Linuc 101 Linux コマンド -- kill -15, kill -9, killall, -- 掃除して、強く、同じコマンド由来のプロセスを殺す

kill とは

指定した引数のプロセスを殺す。止めるのではなく消し去る。

kill PID で tmux を殺す

とりあえず何かを殺してみよう。

tmux は常時起動している。

これなら止めても PC が止まることはないだろうし試しに殺してみる

ps
  PID TTY           TIME CMD
57464 ttys000    0:00.05 /bin/bash -l
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
  777 ttys004    0:00.04 -bash
 7348 ttys004    0:00.01 tmux

tmux の PID を確認

kill 7348

[terminated]

終了。と出て tmux の起動前のターミナルに戻った。わかりやすい。

シグナル

シグナルとは

kill -l で セットできる シグナルのリストが出る

kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL
 5) SIGTRAP  6) SIGABRT  7) SIGEMT   8) SIGFPE
 9) SIGKILL 10) SIGBUS  11) SIGSEGV 12) SIGSYS
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN 22) SIGTTOU 23) SIGIO   24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM   27) SIGPROF 28) SIGWINCH
29) SIGINFO 30) SIGUSR1 31) SIGUSR2

暗殺に使う道具的なイメージ。デフォルトは 15番の「ナイフとモップ」を使う

シグナル15 - TERM(INATE)、綺麗に終わらせる。

https://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

デフォルトは 15 の SIGTERM ( Signal Terminate ) 、シグナル終了になっている

つまりさっきの

kill 7348 は kill -15 7348 や kill -SIGTERM 7348 と同じらしい。

試してみると両方 terminated になった。

しかしこれではパワーが弱く、殺しきれないプロセスがあるらしい。

確かに tmux 開いて殺してを続けていると

ps
  PID TTY           TIME CMD
57464 ttys000    0:00.05 /bin/bash -l
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
 7719 ttys003    0:00.02 -bash
  777 ttys004    0:00.07 -bash
 7848 ttys005    0:00.03 -bash

よくわからない bash が増えているし、これは 15 番では殺せなかった。

より強いシグナルとして 9 番があるらしい。

しかし 9 は 15 の完全上位互換なわけではない。15 番はナイフとモップ、 殺した後の掃除までするので、使っていたリソースやロックファイルを掃除してから現場を離れる。

killコマンドが使用するデフォルトのシグナルであるSIGTERM(15)は、プログラムを終了する前に、アプリケーションごとに必要なクリーンアップ(終了処理)の処理を行ってから、自分自身でプロセスを終了します。クリーンアップでは、使っていたリソースの解放やロックファイルの削除などを行います。

山本 道子,大竹 龍史. Linux教科書 LinuCレベル1 スピードマスター問題集 Version10.0対応 (Japanese Edition) (Kindle Locations 958-961). Kindle Edition.

シグナル9 - KILL - 絶対殺すシグナル

Signal Kill、15 番がナイフとモップならこっちはショットガン。

これなら殺せそう。試しに下から2番目を殺してみる。

kill -9 777

[Process completed]

......... 今打ち込むところを殺してしまったのか.... 何も打ち込めない....

しかし 15番で殺せないプロセスを殺せた!!!

Terminal アプリを再起動。気を取り直して一番上にある 57464 を殺してみる

kill -9 57464

ps
  PID TTY           TIME CMD
59816 ttys001    0:00.25 -bash
 7349 ttys002    0:00.02 -bash
 7719 ttys003    0:00.02 -bash
 8042 ttys004    0:00.03 -bash
 7848 ttys005    0:00.03 -bash

消えてる!!!多重起動している bash が消せた!

おそらく下が新しいので、一番下以外は消せるのだろう。

ps
  PID TTY           TIME CMD
 8042 ttys004    0:00.04 -bash
 7848 ttys005    0:00.03 -bash
RYOs-MBP:~ kaede$ kill -9 8042

[Process completed]

また終わってしまった... ラスト2つは必要らしい。

しかしショットガンに例えたように万能なわけではなく、飛び散るのでクリーンアップがされない問題点がある。

killall - 系列プロセス皆殺し

killall tmux

[terminated]
ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.02 -bash

killall だとtmux のなかで発動しても、プロセス ID ではなく、 プロセスの名前で殺すことができた。わかりやすい。

そしてその後は kill で殺した場合と違い、起動している bash が一つになった。なるべく killall で殺した方が良さそう。

tmux

ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.06 -bash
 9191 ttys000    0:00.01 tmux
 9194 ttys001    0:00.02 -bash
kill 9191
[terminated]
kaede$ ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.06 -bash
 9194 ttys001    0:00.02 -bash

こうして tmux を kill -15 で殺した場合だとまだ bash が生き残っている。

tmux は子プロセスとして bash を召喚しており、kill -15 だと 子供までは殺しきれない... と推測したが それは違った

親プロセス子プロセスについては次回以降で調べる必要がありそうだ...

yang.amp.i.kyoto-u.ac.jp

(起動コマンドが) 同じ名前だから tmux が動かした bash が殺されているようだ。

killall tmux

ps
  PID TTY           TIME CMD
 8216 ttys000    0:00.04 -bash

なのでちゃんと killall で kill すると、tmux が動かしていた bash も完全消滅する。

ps aux | grep tmux
USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND 
kaede             9193   0.1  0.0  4327316   2420   ??  Ss    7:44AM   0:00.06 tmux
kaede             9619   0.0  0.0  4258892    212 s002  R+    7:56AM   0:00.00 grep tmux
kaede             9500   0.0  0.0  4289360   1352 s000  S+    7:56AM   0:00.01 tmux

aux と grep でしっかり見てみると、プロセスの開始が tmux によって始まっていると明記されているので、killall でまとめて殺されているようだ。

killall tmux
No matching processes belonging to you were found

ちなみに終わってるプロセスを指定するとちゃんとエラーが出る。

まとめ

https://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

シグナルはたくさんあるけど、この記事が kill と killall の紹介だけでしめているからよしとする

kill YourProcessID が kill -15 YourProcessID と同じで、指定した一つのプロセスを殺す。掃除もする。

kill -9 YourProcessID が 絶対殺すコマンドで、15 番で殺せないプロセスも殺せる

killall StartedCommandOfYourProcess が プロセスを起動したコマンド名で動いた プロセスを全部殺すコマンド。

シグナルを打つほかの動作

https://www.atmarkit.co.jp/ait/spv/1708/04/news015.html

この記事が分かりやすかった。

nohup が付けられてないジョブでなければ

SIG-HUPで止まる。ctrl c でうてる

SIG-TSTP は ctrl z の 一時停止。 Temporally Stop (多分)

で kill 以外でもシグナルをうてる。