演習 - 問題のあるプロセスを終了する

完了

コンピューターは完全ではありません。 遅かれ早かれ、何かがおかしくなる "ものです"。 システム管理者という職務があるのはそのためです。システム管理者は、トラブルシューティングを行い、システムの問題を解決する必要があります。

Python アプリケーションで問題が発生していると仮定します。 CPU 時間の消費量が非常に多いか、応答を停止している可能性があります。 どちらの場合も、アプリケーションを停止する必要があります。 プロセスまたはアプリケーションを特定するには、psgrep を使います。 次に、kill コマンドを使って、それを停止することができます。 これを、自分の Linux 仮想マシンで練習しましょう。

問題のあるプロセスを開始する

プロセスを強制終了してみるには、強制終了するプロセスが必要です。 それを作ってみましょう。

  1. 次のコマンドを入力して、ホーム ベースに戻ります。

    cd ~
    
  2. Azure Cloud Shell で次のコマンドを入力して、Linux の vi エディターを開始します。

    vi bad.py
    

    vi は、Linux が Unix から受け継いだ、広く使われているテキスト エディターです。 好き嫌いにかかわらず、Bash ユーザーであれば vi の基本を知っておく必要があります。

  3. i キーを押して、vi を挿入モードにします。 次に、以下の Python プログラムを入力します。

    i = 0
    while i == 0:
        pass
    

    このプログラムを実行すると、無限ループになります。明らかに、サーバー上で起こってほしくないことです。

  4. Esc キーを押して、挿入モードを終了します。 次のコマンドを入力してから Enter キーを押し、プログラムを保存して、vi を終了します。

    :wq
    

    コマンドの先頭のコロンを忘れずに含めてください。 コマンドの意味ですが、w は "write" (書き込み) を表し、q は "quit" (終了) を表します。

  5. 次に、以下のコマンドを使ってプログラムを開始し、バックグラウンドで実行したままにします。

    python3 bad.py &
    

    コマンドの末尾のアンパサンド (&) を忘れずに含めてください。 そうしないと、Bash プロンプトに戻りません。 Bash では、アンパサンドを指定すると、コマンドが実行され、コマンドが完了していなくても、コマンド ラインに戻ります。

よくわかりませんが、bad.py はバックグラウンドで実行されており、他のプロセスから CPU サイクルを盗んでいます。 何が起こっているのか詳しく調べてみましょう。

プロセスを強制終了する

プロセスを強制終了するには、プロセス名またはプロセス ID が必要です。 これは ps の仕事です。

  1. メモリを更新するため、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
    
  2. この一覧から、bad.py によってサーバーの CPU 時間の 99% が消費されていることがわかります。 プログラムは名前のとおりのものになっています。

    kill コマンドは、プロセス ID に基づいて実行中のプロセスを強制終了します。 (関連する killall という名前のコマンドは、プロセス名に基づいてプロセスを強制終了します)。kill を呼び出すときは、プロセスの強制終了に使用する "シグナル" の種類を決める必要があります。 シグナルの種類の一覧を表示するには、次のコマンドを使います。

    kill -l
    
  3. バックグラウンドで実行され、オペレーティング システムに重要なサービスを提供しているデーモン プロセスを強制終了する場合は、強制終了したデーモンをすぐに再起動することをお勧めします。 それを行うには、SIGHUP シグナルを使用します。

    この例では、プロセスを再起動せずに強制終了します。 したがって、番号 9 に対応する SIGKILL シグナルを使います。 そのためには、ps -ef の出力から bad.py のプロセス ID を取得し (2 番目の列にあります)、次のコマンドを使ってプロセスを終了します。 PROCESS_ID はプロセス ID に置き換えます。

    kill -9 PROCESS_ID
    

    同じコマンドを kill -s SIGKILL PROCESS_ID と入力することもできます。 シグナルの名前と番号のどちらを使うかは、ユーザー次第です。

  4. 最後に、ps をもう一度実行し、bad.py が動いていないことを確認します。

pskill は、不適切に記述されたプログラムによって残された子プロセスである "ゾンビ プロセス" を特定して終了するためにもよく使われます。