前の記事では、
psやtopを使って、
Linux上で動いているプロセスを確認する方法を学習しました。
では、確認したプロセスが応答しなくなったり、 何らかの理由で終了させる必要がある場合はどうすればよいのでしょうか。
問題のプロセスを確認
対象プロセスを特定
終了を要求する
Linuxでは、このような場合に killコマンドを利用できます。
ただし、killは単純に 「プロセスを強制終了するコマンド」 というわけではありません。
killコマンドの本質を理解するには、 Linuxのシグナルについて理解することが重要です。
この記事はLinux中級講座の一部です。 killコマンドとシグナルの仕組みを理解し、 プロセスを安全に終了する方法を学習します。
Linux中級講座を見る →
killコマンドでPIDを指定して
プロセスへ終了を要求できるようになり、
SIGTERMとSIGKILLの違いを理解して
適切に使い分けられる状態を目指します。
killコマンドとは?
killは、 指定したプロセスへ シグナル(signal)を送信するコマンドです。
基本的な書式は次のとおりです。
kill [オプション] PID
たとえばPIDが
1400
のプロセスへ終了を要求する場合は、
次のように実行します。
kill 1400
$ ps aux | grep mysqld
mysql 1400 2.8 8.2 950000 330000 ? Ssl 09:05 4:31 mysqld
$ kill 1400
これによってPID 1400のプロセスへ 終了を要求できます。
シグナルとは?
Linuxでは、プロセスに対して 「終了してください」「停止してください」「再開してください」 といった通知を送る仕組みがあります。
この通知が シグナル(signal) です。
つまりkillコマンドは、 プロセスそのものを直接消しているというより、 指定したプロセスへシグナルを送っている と考えると理解しやすくなります。
kill PIDではSIGTERMが送られる
シグナルを指定せずに
kill PID
を実行すると、通常は
SIGTERM
というシグナルが送られます。
kill 1400
いずれもPID 1400へ SIGTERMを送る操作です。
プロセスへ 「安全に終了してください」 と要求するための代表的なシグナルです。
SIGTERMは「終了する機会」をプロセスへ与える
SIGTERMを受け取ったプロセスは、 終了前に必要な処理を行える場合があります。
実際にどのような終了処理を行うかは プログラムによって異なりますが、 基本的にはまずSIGTERMで正常終了を要求する と覚えておきましょう。
kill -9とは?SIGKILLによる強制終了
プロセスが異常な状態になっている場合、 SIGTERMを送っても終了しないことがあります。
そのような場合に登場するのが、 SIGKILLです。
kill -9 1400
-9は、
シグナル番号9の
SIGKILLを意味します。
プロセス側で無視したり処理したりできない 強制的な終了シグナルです。
SIGTERMとSIGKILLの違い
終了を要求する
プロセス側が終了処理を行える余地があります。
kill PID
基本はこちらを先に使う
強制終了する
プロセス側で処理できず、強制的に終了させます。
kill -9 PID
必要な場合の最終手段
最初からkill -9を使わない理由
「強制終了できるなら、
最初からkill -9を使えばよいのでは?」
と思うかもしれません。
しかし、基本的にはおすすめできません。
プログラムが本来行う終了処理を実行できません。
ファイルやデータを処理している途中かもしれません。
何が起きていたのか確認する前にプロセスを消してしまう可能性があります。
まずプロセスの状態や影響を確認し、 SIGTERMなど通常の終了方法を試します。 SIGKILLは、それでも終了できない場合に検討します。
安全にプロセスを終了する基本手順
実務では、いきなりkillを実行するのではなく、 対象を確認してから終了する ことが重要です。
ps aux | grep process
PID 1400
kill 1400
ps aux | grep process
kill -9 1400
誰のプロセスでも終了できるわけではない
Linuxでは、 ユーザが自由にすべてのプロセスへ シグナルを送れるわけではありません。
たとえば一般ユーザで、 別ユーザが所有するプロセスを終了しようとすると、 権限不足になることがあります。
$ kill 1400
-bash: kill: (1400) - Operation not permitted
このような場合、 必要な権限があり、かつ終了して問題ないプロセスであることを確認したうえで、 管理者権限を利用することがあります。
sudo kill 1400
Linux中級の前半で学習した ユーザや権限の考え方は、 プロセス管理でも重要になります。
ほかにはどんなシグナルがある?
LinuxにはSIGTERM・SIGKILL以外にも 多くのシグナルがあります。
シグナル一覧は次のコマンドで確認できます。
kill -l
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT
9) SIGKILL 15) SIGTERM 18) SIGCONT
19) SIGSTOP ...
すべてを暗記する必要はありません。 まずは次の2つを確実に理解しておきましょう。
15
通常の終了要求
9
強制終了
ここで実際に試してみよう:killコマンド疑似ターミナル
ここでは疑似Linux環境で、 プロセスの確認から終了まで 実際に操作してみましょう。
まず
ps aux
を実行して、動いているプロセスを確認してください。
Linux Process Control
まずプロセスを確認しましょう
ps auxを実行してdemo-workerのPIDを探してください。
おすすめの操作順
ps aux
PID 1400を確認
kill 1400
SIGTERMを送信
ps aux
終了を確認
一度終了したら
reset
を実行してプロセスを復活させ、
kill -9 1400
も試してみてください。
理解度チェック:どのコマンドを実行する?
次の状況を考えてみましょう。
プロセスを終了する必要がありますが、 まだ通常の終了要求は試していません。
最初に実行するコマンドとして適切なのはどれでしょうか?
SIGTERMとSIGKILLの違いを思い出してみましょう。
サービスはkillで止めればよい?
ここまで学習すると、 「WebサーバやSSHなどもプロセスなのだから、 killで終了すればよいのでは?」 と思うかもしれません。
確かにサービスもLinux上では プロセスとして動いています。
しかし、systemdを利用するLinuxでは、 サービスの起動・停止・再起動などは systemctlを使って管理するのが基本です。
systemctl stop nginx
killはプロセスへシグナルを送るためのコマンドです。 一方、systemctlはsystemdが管理するサービスを操作する ために利用します。
この違いを理解すると、 Linuxのプロセス管理とサービス管理がつながって見えてきます。
確認問題:killコマンドの基本を確認しよう
「kill 1400」を実行した場合、通常送信されるシグナルはどれですか?
シグナルを指定せずにkillを実行すると、 通常はSIGTERM(シグナル番号15)が送信されます。
「kill -9 1400」が意味するものはどれですか?
-9はシグナル番号9のSIGKILLを指定しています。 SIGKILLはプロセス側で処理できない強制終了シグナルです。
プロセスを終了するときの基本的な考え方として適切なのはどれですか?
基本は対象プロセスを確認したうえでSIGTERMによる終了を試します。 SIGKILLは通常の方法で終了できない場合などに検討します。
3問に挑戦してみましょう。
まとめ
killは、 指定したプロセスへシグナルを送るコマンド
kill PIDでは通常
SIGTERM(15)が送信される
kill -9 PIDでは
SIGKILL(9)が送信される
基本はSIGTERMを先に試し、 SIGKILLは必要な場合に利用する
killする前後には psなどで対象プロセスと終了結果を確認する
次は「systemctlでLinuxサービスを管理する」を学びましょう
ps・top・killを使って、 Linuxのプロセスを確認・終了する方法を学習しました。
次の記事では視点を 「個々のプロセス」からサービスへ広げます。
systemctlを使ったサービスの 起動・停止・再起動・状態確認・自動起動設定を学習し、 Linuxサーバ運用で頻繁に使うサービス管理の基本を身につけます。
systemctlでLinuxサービスを管理する →
