演習 - 問題のあるプロセスを終了する
コンピューターは完全ではありません。 遅かれ早かれ、何かがおかしくなる "ものです"。 システム管理者という職務があるのはそのためです。システム管理者は、トラブルシューティングを行い、システムの問題を解決する必要があります。
Python アプリケーションで問題が発生していると仮定します。 たとえば、CPU 時間を占有し過ぎているや、応答を停止したといったことが考えられます。 どちらの場合も、アプリケーションを停止する必要があります。 プロセスまたはアプリケーションを特定するには、ps
と grep
を使います。 次に、kill
コマンドを使って、それを停止することができます。 これを、自分の Linux 仮想マシンで練習しましょう。
問題のあるプロセスを開始する
プロセスを強制終了してみるには、強制終了するプロセスが必要です。 それを作ってみましょう。
次のコマンドを入力して、ホーム ベースに戻ります。
cd ~
Azure Cloud Shell で次のコマンドを入力して、Linux の
vi
エディターを開始します。vi bad.py
vi
は、Linux が Unix から受け継いだ、広く使われているテキスト エディターです。 好き嫌いにかかわらず、Bash ユーザーであればvi
の基本を知っておく必要があります。i キーを押して、
vi
を挿入モードにします。 次に、以下の Python プログラムを入力します。i = 0 while i == 0: pass
このプログラムを実行すると、無限ループになります。明らかに、サーバー上で起こってほしくないことです。
Esc キーを押して、挿入モードを終了します。 次のコマンドを入力してから Enter キーを押し、プログラムを保存して、
vi
を終了します。:wq
コマンドの先頭のコロンを忘れずに含めてください。 コマンドの意味ですが、
w
は "write" (書き込み) を表し、q
は "quit" (終了) を表します。次に、以下のコマンドを使ってプログラムを開始し、バックグラウンドで実行したままにします。
python3 bad.py &
コマンドの末尾のアンパサンド (
&
) を忘れずに含めてください。 そうしないと、Bash プロンプトに戻りません。 Bash では、アンパサンドを指定すると、コマンドが実行され、コマンドが完了していなくても、コマンド ラインに戻ります。
よくわかりませんが、bad.py はバックグラウンドで実行されており、他のプロセスから CPU サイクルを盗んでいます。 何が起こっているのか詳しく調べてみましょう。
プロセスを強制終了する
プロセスを強制終了するには、プロセス名またはプロセス ID が必要です。 これは ps
の仕事です。
メモリを更新するため、
ps -ef
コマンドを実行すると、実行中のすべてのプロセスが一覧表示され、それぞれについて大量の情報が示されます。 次のコマンドを使って、実行中のすべてのプロセスを一覧表示し、結果をフィルター処理して、"python" が含まれる行だけにします。ps -ef | grep python
結果は次のようになります。
yourname+ 342 254 99 23:34 pts/1 00:00:31 python3 bad.py yourname+ 344 254 0 23:35 pts/1 00:00:00 grep --color=auto python
この一覧から、bad.py によってサーバーの CPU 時間の 99% が消費されていることがわかります。 プログラムは名前のとおりのものになっています。
kill
コマンドは、プロセス ID に基づいて実行中のプロセスを強制終了します。 (関連するkillall
という名前のコマンドは、プロセス名に基づいてプロセスを強制終了します)。kill
を呼び出すときは、プロセスの強制終了に使用する "シグナル" の種類を決める必要があります。 シグナルの種類の一覧を表示するには、次のコマンドを使います。kill -l
バックグラウンドで実行され、オペレーティング システムに重要なサービスを提供しているデーモン プロセスを強制終了する場合は、強制終了したデーモンをすぐに再起動することをお勧めします。 それを行うには、
SIGHUP
シグナルを使用します。この例では、プロセスを再起動せずに強制終了します。 したがって、番号 9 に対応する
SIGKILL
シグナルを使います。 そのためには、ps -ef
の出力から bad.py のプロセス ID を取得し (2 番目の列にあります)、次のコマンドを使ってプロセスを終了します。PROCESS_ID
はプロセス ID に置き換えます。kill -9 PROCESS_ID
同じコマンドを
kill -s SIGKILL PROCESS_ID
と入力することもできます。 シグナルの名前と番号のどちらを使うかは、ユーザー次第です。最後に、
ps
をもう一度実行し、bad.py が動いていないことを確認します。
ps
と kill
は、不適切に記述されたプログラムによって残された子プロセスである "ゾンビ プロセス" を特定して終了するためにもよく使われます。