kill - プロセスにシグナルを送信する

スポンサーリンク

killコマンドはプロセスにデフォルトとしてTERMシグナルを送信し、そのプロセスを終了できます。

また、killコマンドはプロセスを強制終了させたいときにも、よく利用されます。

その場合は、killコマンドはKILLシグナルを送信して、プロセスを強制終了させます。

シグナルとは

シグナル(signal)は、日本語では信号という意味になります。シグナルにはいくつか種類があり、それぞれのシグナルにはどのような処理を行うかが決まっています。プロセスに対して、シグナルを送信すると、プロセスはその決まった処理を実行します。

シグナルには、どのような処理が行われるかがデフォルトですでに決められています。

デフォルトのアクション

アクション意味
Termプロセスの終了
Ignシグナルを無視
Coreプロセスの終了とコアダンプファイルの作成
Stopプロセスの停止
Cont停止中のプロセスを再開

シグナルはどのようなときに送信されるかどうかも決められています。
例えば、POSIX.1-1990 に定義されている実際のシグナルは以下のような表になります。

POSIX.1-1990のシグナル表

シグナルアクション意味(シグナル送信のタイミング等)
SIGHUP 1Term制御端末のハングアップ(操作不能状態)の検出や
制御しているプロセスの死
SIGINT 2Termキーボードからの割り込み (Interrupt)
SIGQUIT 3Coreキーボードによる中止 (Quit)
SIGILL 4Core不正な命令
SIGABRT 6Coreabort(3) からの中断 (Abort) シグナル
SIGFPE 8Core浮動小数点例外
SIGKILL 9TermKill シグナル
SIGSEGV11Core不正なメモリー参照
SIGPIPE13Termパイプ破壊:
読み手の無いパイプへの書き出し
SIGALRM14Termalarm(2) からのタイマーシグナル
SIGTERM15Term終了 (termination) シグナル
SIGUSR130,10,16Termユーザー定義シグナル 1
SIGUSR231,12,17Termユーザー定義シグナル 2
SIGCHLD20,17,18Ign子プロセスの一時停止 (stop) または終了
SIGCONT19,18,25Cont一時停止 (stop) からの再開
SIGSTOP17,19,23Stopプロセスの一時停止 (stop)
SIGTSTP18,20,24Stop端末より入力された一時停止 (stop)
SIGTTIN21,21,26Stopバックグランドプロセスの端末入力
SIGTTOU22,22,27Stopバックグランドプロセスの端末出力

(参考:Man page of SIGNAL

プロセスの終了

killコマンドはプロセスID(PID)を指定すると、デフォルトではTERM(15)シグナルを指定したプロセスに送信して、プロセスを終了させます。また、プロセスIDの確認方法としてpsコマンドが利用できます。

ここでは、test.shというスクリプトをバックグラウンドで実行させて、そのプロセスを終了させていきます。

test.sh

コマンド例と実行結果

シグナルを指定
(-sオプション等)

killコマンドで送信するシグナルを指定するオプションは、いくつかあります。また、シグナルを指定する方法もいくつかあります。

まず、シグナルを指定するオプションのコマンド例は以下のようになります。

そして、シグナルを指定する方法はシグナル番号もしくはシグナル名を用いて指定することができます。以下はすべて同じ動作をするコマンド例です。

TERMシグナルを送信してもプロセスが終了しない場合、プロセスを強制終了させる方法としてKILL(9)シグナルを送信する方法があります。以下はKILLシグナルを送信してプロセスを終了させる例になります。

コマンド例と実行結果

ジョブスペックを指定してプロセスを終了

killコマンドはbash組み込みコマンドのjobsコマンドで確認できるジョブスペック(jobspec, job specification)を用いて、プロセスを終了することができます。ジョブスペックは'%n'のような形式で指定を行います。

コマンド例と実行結果

ジョブスペックの指定方法について、'%'または'%%'または'%+'を用いると現在のジョブを参照することができます。現在のジョブとはjobsコマンドで確認した場合、数字の後に'+'の記号がついているジョブになります。
また、一番最近にCtrl+zでプロセスを停止させたり、プログラムの実行時に'&'の文字を利用して、バックグラウンド処理をさせた場合の処理が現在のジョブになります。
また、'%-'を指定すると前のジョブを参照できます。これはjobsコマンドで確認した場合、数字の後に'-'の記号がついているジョブになります。また、ジョブが一つしか存在しない場合はそのジョブが参照されます。

プロセスグループIDでの終了

killコマンドで指定するプロセスIDが負の値の場合、その指定した値の絶対値のプロセスグループID(PGID)として指定できます。これは多くのプロセスを作成するプログラムを終了するのに利用できます。また、プロセスグループIDを確認するには'ps -j'のコマンドを利用することができます

コマンド例と実行結果

指定するプロセスIDが0の場合は、現在プロセスのプロセスグループ内のすべてのプロセスに対して、シグナルが送信します。
また、指定するプロセスIDが-1の場合は、シグナルを送信する権限を持つすべてのプロセスに対して、シグナルを送信します。

負の値のプロセスIDを指定する場合はオプションの終端を示す'--'やシグナルを指定する必要があります。

psコマンドにaのオプションとxのオプションを追加すると、全てのプロセスを表示することができます。psコマンドの-jオプションでPGIDを確認する方法と組み合わせると以下のコマンドで全てのプロセスについて確認することができます。

シグナルのリストを表示
(-lオプション)

-lオプションは引数がない状態では、シグナルのリストを表示します。

コマンド例と実行結果

シグナル名またはシグナル番号などの引数がある場合、シグナル名ならば対応するシグナル番号を、シグナル番号ならば引数に対応するシグナル名を表示します。

コマンド例と実行結果

参考

GNU Coreutils: kill invocation

Bash Reference Manual: Job Control Builtins

Man page of SIGNAL