kill, killall, pkill コマンドによるプロセスの終了
このステップでは、kill, killall, pkill コマンドを使用してプロセスを終了する方法を学びます。これらのコマンドは、システムリソースの管理と、動作異常なアプリケーションの停止に不可欠です。
Linux のプロセスはシグナルに応答します。シグナルは、プロセスに送信されるソフトウェアの割り込みです。異なるシグナルは、プロセスを終了する、一時停止する、または構成ファイルを再読み込みさせるなど、異なる意味を持ちます。
まず、いくつかの基本的なプロセス管理シグナルについて理解しましょう。
- SIGTERM (15):
kill コマンドによってデフォルトで送信されるシグナル。プロセスを終了するための「丁寧な」要求です。プロセスはこのシグナルを受け取り、クリーンアップしてから終了できます。
- SIGKILL (9): 強制的な即時終了を行う「ブロック不可能な」シグナル。プロセスは無視したり、処理したりできません。最後の手段として使用してください。
- SIGHUP (1): プロセスを再起動せずに構成ファイルの再読み込みを行うために使用されることがよくあります。
- SIGINT (2):
Ctrl+C を押すことで送信され、通常はフォアグラウンドプロセスを中断するために使用されます。
- SIGSTOP (19): プロセスを一時停止します。ブロックしたり、処理したりできません。
- SIGCONT (18): 一時停止したプロセスを再開します。
利用可能なすべてのシグナルとその番号は、kill -l を使用して表示できます。
kill -l
次の様なシグナルのリストが表示されます。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...出力省略...
kill の使用
kill コマンドは、プロセス ID (PID) で識別されるプロセスに、指定されたシグナルを送信します。
終了の練習をするために、いくつかのバックグラウンドプロセスを作成しましょう。再び sleep コマンドを使用します。
sleep 300 &
sleep 301 &
sleep 302 &
jobs を使用して、それらのジョブ番号と PID を確認します。
jobs
[1] 1234
[2] 1235
[3] 1236
(注:実際の PID は異なります。)
最初の sleep プロセスの PID を見つけましょう。ps aux | grep sleep を使用して、sleep 300 に関連付けられた PID を探します。
ps aux | grep sleep
次の様な出力が表示されます。sleep 300 の PID を特定します。例えば、PID が 1234 の場合:
labex 1234 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 300
labex 1235 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 301
labex 1236 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 302
labex 1237 0.0 0.0 6000 1000 pts/0 S+ HH:MM 0:00 grep sleep
デフォルトの SIGTERM シグナルを使用して sleep 300 を終了するには、kill に続けてその PID を使用します。1234 を実際に見つかった PID に置き換えます。
kill 1234
[1]+ Terminated sleep 300 といったメッセージが表示されるかもしれません。jobs または ps aux | grep sleep を使用して、それが終了したことを確認します。
jobs
[2]- Running sleep 301 &
[3]+ Running sleep 302 &
次に、SIGKILL を使用して sleep 301 を強制終了します。その PID (例:1235) を見つけて、kill -9 または kill -SIGKILL を使用します。
kill -9 1235
おそらく [2]- Killed sleep 301 というメッセージが表示されます。再度確認します。
jobs
[3]+ Running sleep 302 &
killall の使用
killall コマンドは、PID ではなく名前でプロセスを終了します。指定されたコマンド名と一致するすべてのプロセスにシグナルを送信します。
さらにいくつかの sleep プロセスを作成します。
sleep 303 &
sleep 304 &
sleep 305 &
実行されていることを確認します。
jobs
[3] Running sleep 302 &
[4] Running sleep 303 &
[5] Running sleep 304 &
[6] Running sleep 305 &
これで、killall を使用してすべての sleep プロセスを終了します。デフォルトでは、killall は SIGTERM を送信します。
killall sleep
終了した各 sleep プロセスに関するメッセージが表示されます。すべての sleep プロセスが終了したことを確認します。
jobs
(no output)
pkill の使用
pkill コマンドは killall と似ていますが、コマンド名、ユーザー ID、グループ ID、制御端末など、より高度な選択基準を提供し、パターンマッチングも可能です。特定のプロセスセットをターゲットにするのに非常に強力です。
pkill のためにいくつかの新しい sleep プロセスを作成します。
sleep 306 &
sleep 307 &
sleep 308 &
実行されていることを確認します。
jobs
[1] Running sleep 306 &
[2] Running sleep 307 &
[3] Running sleep 308 &
現在のユーザー (labex) が所有するすべての sleep プロセスを終了するには、pkill -u labex sleep を使用できます。
pkill -u labex sleep
このコマンドは、labex ユーザーに属するすべての sleep プロセスを終了します。
すべての sleep プロセスが終了したことを確認します。
jobs
(no output)
pkill はパターンとも使用できます。たとえば、my_app_v1 と my_app_v2 という名前のプロセスがあった場合、pkill my_app で両方を終了できます。
これらのコマンドは、PID で単一のプロセスをターゲットにすることから、名前やその他の属性に基づいて複数のプロセスを終了するまで、プロセスを管理および終了するための柔軟な方法を提供します。kill -9 または SIGKILL を使用する際は、プロセスがクリーンアップする機会がない場合、データ損失につながる可能性があるため、常に注意してください。