kill プロセスにシグナルを送って終了させる
kill [-シグナル] PID...試してみる
kill -l | head -5送れるシグナルの一覧を表示します(先頭の数行だけ)。
kill -l 15番号 15 のシグナルの名前を調べます。
ps -C sleep -o pid,cmd終了させる相手のPIDを確認します。
kill "$(pgrep -f '^sleep 100001')"名前から探したPIDに、シグナルを送ります。何も指定しなければ SIGTERM(15)です。
sleep 1; ps -C sleep -o pid,cmd100001 のほうだけが消えたことを確かめます。
kill -9 "$(pgrep -f '^sleep 100002')"もう一方を SIGKILL(9)で強制終了します。
主なオプション
-l | シグナルの一覧を表示する。番号を渡すと名前、名前を渡すと番号を表示する |
|---|---|
-シグナル | 送るシグナルを番号か名前で指定する(-9、-KILL、-SIGKILL など) |
-s シグナル | -シグナル と同じ。-s KILL のように書く |
-0 | 何も送らず、プロセスが存在して送れる状態かだけを調べる |
解説
名前ではなく PID で指定する
kill は、プロセスID(PID)を指定してシグナルを送るコマンドです。名前で指定したいときは pkill か killall を使います。PID は ps や pgrep で調べます。
よく使うシグナル
| 番号 | 名前 | 意味 |
|---|---|---|
| 1 | SIGHUP | 端末の切断。設定ファイルの再読み込みにも使われる |
| 2 | SIGINT | 割り込み(Ctrl+C) |
| 9 | SIGKILL | 強制終了。プロセスは無視できない |
| 15 | SIGTERM | 終了要求。何も指定しないとこれが送られる |
| 18 | SIGCONT | 停止中のプロセスを再開する |
| 19 | SIGSTOP | プロセスを一時停止する。無視できない |
まず 15、効かなければ 9
SIGTERM はプロセス側が受け取って後始末(ファイルの保存や一時ファイルの削除)をしてから終われます。一方 SIGKILL は、カーネルが即座に終了させるので後始末ができません。そのため、まず kill PID で試し、それでも終わらないときだけ kill -9 PID を使います。
権限
自分のプロセスにはシグナルを送れますが、他のユーザーのプロセスには root でないと送れません。存在しない PID を指定すると、No such process というエラーになります。
シェルの組み込みコマンドとして kill が動くので、%1 のようにジョブ番号でも指定できます(jobs で確認)。