Linux でのプロセスの終了

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、killkillall、およびpkillコマンドを使用してLinuxでプロセスを終了する方法を学びます。これらのコマンドは、実行中のプロセスを管理するために不可欠であり、応答しないアプリケーションを停止したり、システムリソースを解放したりするために使用できます。

この実験が終了すると、以下のことができるようになります。

  • killコマンドを使用して特定のプロセスを終了する
  • killallコマンドを使用して名前で複数のプロセスを終了する
  • killallの代替としてpkillコマンドを使用する

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/pkill("Pattern-Based Killing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/UserandGroupManagementGroup -.-> linux/sudo("Privilege Granting") subgraph Lab Skills linux/sleep -.-> lab-44{{"Linux でのプロセスの終了"}} linux/grep -.-> lab-44{{"Linux でのプロセスの終了"}} linux/kill -.-> lab-44{{"Linux でのプロセスの終了"}} linux/killall -.-> lab-44{{"Linux でのプロセスの終了"}} linux/pkill -.-> lab-44{{"Linux でのプロセスの終了"}} linux/ps -.-> lab-44{{"Linux でのプロセスの終了"}} linux/sudo -.-> lab-44{{"Linux でのプロセスの終了"}} end

プロセスIDとシグナルの理解

プロセスを終了する前に、2つの重要な概念を理解することが重要です。プロセスID(PID)とシグナルです。

  1. Ubuntu VMでターミナルを開きます。デフォルトでは/home/labex/projectディレクトリにいるはずです。もし確認ができない場合は、pwdと入力してEnterキーを押すことで現在のディレクトリを常に確認できます。

  2. まずは簡単なバックグラウンドプロセスを実行しましょう。次のコマンドを入力します。

    sleep 1000 &

    このコマンドは1000秒間スリープするプロセスを開始し、バックグラウンドで実行します。末尾の&はシェルにコマンドをバックグラウンドで実行するように指示し、ターミナルを引き続き使用できるようにします。

  3. 実行中のプロセスを表示するには、psコマンドを使用します。

    ps aux | grep sleep

    このコマンドはすべての実行中のプロセス(ps aux)を表示し、その出力をフィルタリングして「sleep」を含む行のみを表示します(grep sleep)。

    次のような出力が表示されるはずです。

ターミナルに表示されるsleepプロセス

2列目の数字がプロセスID(PID)です。後でこれを使ってプロセスを終了します。

  1. Linuxはシグナルを使ってプロセスと通信します。プロセスを終了するための最も一般的なシグナルは以下の通りです。
    • SIGTERM(15):プロセスをグレースフルに終了します。これはkillコマンドが送信するデフォルトのシグナルです。
    • SIGKILL(9):プロセスを強制的に終了します。SIGTERMが機能しない場合には最後の手段として使用する必要があります。

これでPIDとシグナルを理解したので、killコマンドの使用に移りましょう。

killコマンドの使用

killコマンドは、PIDで識別される特定のプロセスにシグナルを送信するために使用されます。デフォルトでは、SIGTERMシグナルを送信し、プロセスにグレースフルに終了するように要求します。

  1. 先ほど開始したsleepプロセスを終了しましょう。まず、psコマンドを使用してそのPIDを見つけます。

    ps aux | grep sleep

    sleepプロセスのPIDをメモしておきます。それは出力の2列目の数字になります。

  2. 次に、killコマンドを使用してプロセスを終了します。

    kill <PID>

    <PID>を実際にメモしたプロセスIDに置き換えます。たとえば、PIDが1234の場合、kill 1234と入力します。

  3. プロセスがまだ実行中であるかどうかを確認します。

    ps aux | grep sleep

    出力には、grepコマンド自体を除いて、もはやsleepプロセスが表示されないはずです。

プロセスがまだ実行中の場合(単純なsleepコマンドではありませんが、より複雑なアプリケーションではあり得ます)、より強力なシグナルを使用できます。

kill -9 <PID>
killコマンドでプロセスを終了する

これはSIGKILLシグナルを送信し、プロセスを強制的に終了します。SIGKILLは慎重に使用してください。プロセスにクリーンアップを行わせないため、より複雑なアプリケーションではデータの損失やその他の問題が発生する可能性があります。

killallコマンドの使用

killallコマンドを使用すると、名前でプロセスを終了できます。これは、PIDを使用する場合よりも便利であり、特に同じプログラムの複数のインスタンスが実行されている場合に役立ちます。

  1. 複数のsleepプロセスを起動します。

    sleep 2000 &
    sleep 2000 &
    sleep 2000 &

    このコマンドは、それぞれが2000秒間バックグラウンドで実行される3つの独立したsleepプロセスを起動します。

  2. プロセスが実行されていることを確認します。

    ps aux | grep sleep

    3つのsleepプロセスが表示されるはずです。

  3. 次に、killallコマンドを使用してすべてのsleepプロセスを終了します。

    sudo killall sleep

    ここでsudoを使用するのは、killallが他のユーザーによって開始されたプロセスやシステムプロセスを終了するためには、昇格された特権が必要な場合があるからです。パスワードの入力を求められる場合があります。

  4. プロセスが終了したことを確認します。

    ps aux | grep sleep

    出力には、grepコマンド自体を除いて、もはやsleepプロセスが表示されないはずです。

「操作が許可されていません」エラーが表示される場合は、特定のプロセスを終了するための必要な権限がないことを意味します。この場合、上記のようにsudoを使用することで問題が解決するはずです。

pkillコマンドの使用

pkillコマンドは、killallと同様に、名前でプロセスを終了する別の方法です。部分的な名前一致に基づいてプロセスを終了したい場合に特に便利です。

  1. さらにいくつかのsleepプロセスを起動します。

    sleep 3000 &
    sleep 3000 &
    sleep 3000 &

    これは、それぞれが3000秒間バックグラウンドで実行されるさらに3つのsleepプロセスを起動します。

  2. これらのプロセスを終了するためにpkillコマンドを使用します。

    sudo pkill sleep

    killallと同様に、すべての一致するプロセスを終了するための必要な権限を持つようにsudoを使用します。

  3. プロセスが終了したことを確認します。

    ps aux | grep sleep

    出力には、grepコマンド自体を除いて、sleepプロセスは表示されないはずです。

pkillkillallの主な違いは、pkillが部分的なプロセス名で一致させることができる点です。たとえば、pkill firefirefoxfirebirdの両方のプロセスを終了します。これは強力であると同時に危険な場合があるので、実行する前に常にpkillコマンドを二重チェックしてください。

実際のアプリケーションでの練習

killkillall、およびpkillの使い方を学んだので、実際のアプリケーションで練習しましょう。Firefoxを例にしますので、この手順はデスクトップ環境で行ってください。

Firefoxプロセスの終了例
  1. Firefoxウェブブラウザを起動します。

    firefox &

    このコマンドはFirefoxをバックグラウンドで起動します。デスクトップにFirefoxのウィンドウが開くはずです。

  2. psコマンドを使ってFirefoxのPIDを見つけます。

    ps aux | grep firefox

    FirefoxのメインプロセスのPIDをメモしておきます。通常、最初に表示されるFirefoxプロセスになります。

  3. killコマンドを使ってFirefoxを終了します。

    kill <PID>

    <PID>を実際にメモしたFirefoxのプロセスIDに置き換えます。

  4. Firefoxが閉じない場合(一部のアプリケーションがSIGTERMシグナルをキャッチするため、そのようなことがあり得ます)、SIGKILLシグナルを使ってみてください。

    kill -9 <PID>

    覚えておいてください。SIGKILLは、アプリケーションが状態を保存したり、適切にクリーンアップしたりできないため、最後の手段として使用する必要があります。

  5. 代わりに、killallまたはpkillを使うこともできます。

    sudo killall firefox

    または

    sudo pkill firefox

    これらのコマンドは一度にすべてのFirefoxプロセスを終了します。個別にプロセスを終了するよりも便利です。

強制的にアプリケーションを終了するとデータの損失が発生する可能性があることを忘れないでください。できるだけ通常通りにアプリケーションを閉じる方が良いです。これらのコマンドは、アプリケーションが応答しない場合や、システムリソースを迅速に解放する必要がある場合に使用する必要があります。

まとめ

おめでとうございます!Linuxでのプロセスの終了に関するこの実験を無事に完了しました。以下のことを学びました。

  1. killコマンドを使用して、PIDによって特定のプロセスを終了する
  2. killallコマンドを使用して、名前によって複数のプロセスを終了する
  3. pkillコマンドをkillallの代替手段として使用する
  4. これらのコマンドを、単純なバックグラウンドプロセスと実際のアプリケーションの両方に適用する

これらのコマンドはプロセス管理の強力なツールですが、慎重に使用してください。重要なシステムプロセスを終了すると、システムの不安定につながる可能性があります。これらのコマンドを使用する前に、必ず終了するプロセスを確認してください。

Linuxの学習を続けるにつれて、これらのプロセス管理スキルは、スムーズに動作するシステムの維持と問題のトラブルシューティングにとって非常に貴重であることがわかります。Linuxでのプロセス管理に慣れるため、これらのコマンドを練習し続けてください!