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 だと 子供までは殺しきれない... と推測したが それは違った
親プロセス子プロセスについては次回以降で調べる必要がありそうだ...
(起動コマンドが) 同じ名前だから 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 以外でもシグナルをうてる。