Linux プロセスの終了

LinuxLinuxBeginner
今すぐ練習

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

はじめに

この実験では、Linux のプロセス管理に関する基本的なスキルを学びます。特に、実行中のプロセスを特定し、必要に応じて終了させる方法に焦点を当てます。プロセス管理は、Linux のユーザーや管理者にとって基本的なスキルであり、システムリソースを効果的に管理するために不可欠です。

ps コマンドを使って実行中のプロセスを特定し、必要に応じて kill コマンドを使ってプロセスを終了させる方法を学びます。これらのツールは、システムのパフォーマンスを維持し、応答しないアプリケーションを処理するために不可欠です。

この実験が終了する頃には、プロセスを特定し、その属性を理解し、さまざまな方法でプロセスを終了させることができるようになります。これらのスキルは、トラブルシューティングや Linux システムの効率的な管理に役立ちます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/bg_process("Background Management") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") subgraph Lab Skills linux/sleep -.-> lab-271315{{"Linux プロセスの終了"}} linux/kill -.-> lab-271315{{"Linux プロセスの終了"}} linux/killall -.-> lab-271315{{"Linux プロセスの終了"}} linux/bg_process -.-> lab-271315{{"Linux プロセスの終了"}} linux/ps -.-> lab-271315{{"Linux プロセスの終了"}} end

プロセスの特定

Linux では、実行中のすべてのプログラムやアプリケーションはプロセスと見なされます。各プロセスには、プロセス ID (Process ID, PID) と呼ばれる一意の識別子があります。プロセスを終了させる前に、PID を使ってそのプロセスを特定する必要があります。

まずは、ps コマンドを使って実行中のプロセスを表示する方法を学びましょう。このコマンドは、システム内のアクティブなプロセスに関する情報を表示します。

まず、LabEx の仮想マシン (VM) 環境でターミナルを開き、以下のコマンドを実行します。

ps

現在のターミナルセッションで実行中のプロセスの基本的なリストが表示されます。出力は次のようになります。

  PID TTY          TIME CMD
 2104 pts/0    00:00:00 zsh
 2116 pts/0    00:00:00 ps

この出力は以下の情報を示しています。

  • PID: プロセス ID 番号
  • TTY: プロセスが実行されているターミナルの種類
  • TIME: プロセスが使用した CPU 時間
  • CMD: プロセスを起動したコマンド

システム上で実行中のすべてのプロセスのより詳細なリストを表示するには、追加のオプションを指定して以下のコマンドを実行します。

ps -aux

これらのオプションの意味は次の通りです。

  • -a: すべてのユーザーのプロセスを表示
  • -u: ユーザーに関連する詳細な形式で表示
  • -x: 制御ターミナルを持たないプロセスも含める

出力ははるかに長く、詳細な内容になり、システム上で実行中のすべてのプロセスが表示されます。

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 167936 11876 ?        Ss   10:30   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    10:30   0:00 [kthreadd]
...
labex       2104  0.0  0.1  11108  5456 pts/0    Ss   10:35   0:00 zsh
labex       2130  0.0  0.0   9828  3384 pts/0    R+   10:36   0:00 ps -aux

次に、練習用の簡単なバックグラウンドプロセスを作成しましょう。

sleep 300 &
sleep_pid=$!

このコマンドは、300 秒 (5 分間) 「スリープ」 (何もしない) するプロセスを起動します。& 記号はプロセスをバックグラウンドで実行し、$! は直近に起動したバックグラウンドプロセスの PID を取得します。

プロセスが実行中であることを確認しましょう。

echo "The sleep process ID is: $sleep_pid"
ps | grep sleep

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

The sleep process ID is: 2135
 2135 pts/0    00:00:00 sleep

これで、プロセスを特定し、その PID を見つける方法がわかりました。次のステップでは、このプロセスを終了させる方法を学びます。

kill コマンドでプロセスを終了させる

これで、プロセスとその PID を特定できたので、kill コマンドを使ってプロセスを終了させる方法を学びましょう。kill コマンドは、プロセスにシグナルを送信し、終了するよう指示します。

kill コマンドの基本的な構文は次の通りです。

kill [options] <PID>

前のステップで作成した sleep プロセスを終了させましょう。その PID は $sleep_pid 変数に保存されています。以下のコマンドを使ってプロセスを終了させます。

kill $sleep_pid

もし PID を忘れてしまった場合は、次のコマンドを使って再度 PID を見つけることができます。

ps | grep sleep

kill コマンドを実行した後、プロセスが終了したことを確認しましょう。

ps | grep sleep

プロセスが正常に終了した場合、出力は何も表示されないか、grep プロセス自体のみが表示されます。これは、sleep プロセスがもう実行されていないことを意味します。

念のため、ps コマンドを再度使ってすべてのプロセスをリストアップすることもできます。

ps -aux | grep sleep

これにより、次のような出力が表示されるかもしれません。

labex       2156  0.0  0.0   7236   720 pts/0    S+   10:40   0:00 grep --color=auto sleep

表示される唯一のプロセスは grep コマンド自体であり、これは sleep プロセスが終了したことを示しています。

デフォルトでは、kill コマンドは TERM (終了) シグナルをプロセスに送信します。これにより、プロセスは必要なクリーンアップ操作を行った後、正常に終了することができます。ほとんどの場合、これでプロセスを終了させるのに十分です。

これで、kill コマンドを使ってプロセスを特定し、終了させることに成功しました。これは、Linux でプロセスを管理するための基本的なスキルです。

キルシグナルの理解

Linux では、kill コマンドは終了シグナルだけでなく、さまざまな種類のシグナルをプロセスに送信することができます。これらのシグナルを理解することで、プロセスの終了方法をより細かく制御することができます。

まず、次のコマンドを実行して、利用可能なすべてのシグナルを確認しましょう。

kill -l

これにより、kill コマンドが送信できるすべてのシグナルがリストされます。出力は次のようになります。

 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
...

最も一般的に使用されるシグナルは以下の通りです。

  • SIGTERM (15): kill コマンドが送信するデフォルトのシグナル。プロセスに正常に終了するよう要求します。
  • SIGKILL (9): プロセスを即座に強制終了させます。プロセスが SIGTERM に応答しない場合に使用します。
  • SIGHUP (1): 従来、設定ファイルをリセットまたは再読み込みするために使用されます。
  • SIGINT (2): ターミナルで Ctrl+C を押したときに送信されます。

練習のために、もう 1 つ sleep プロセスを作成しましょう。

sleep 300 &
sleep_pid=$!
echo "The new sleep process ID is: $sleep_pid"

次に、シグナル番号を使用して特定のシグナルをプロセスに送信しましょう。

kill -15 $sleep_pid

これは、SIGTERM (シグナル 15) を送信するため、デフォルトの kill コマンドと同じです。

プロセスが終了したことを確認しましょう。

ps | grep sleep

SIGKILL シグナルをデモンストレーションするために、もう 1 つ sleep プロセスを作成しましょう。

sleep 300 &
sleep_pid=$!
echo "The third sleep process ID is: $sleep_pid"

次に、SIGKILL シグナルを使用してプロセスを強制終了させましょう。

kill -9 $sleep_pid

プロセスが終了したことを確認しましょう。

ps | grep sleep

SIGKILL シグナル (9) は「最後の手段」となるオプションです。なぜなら、

  1. プロセスが自身のクリーンアップを行うことを許可しません。
  2. リソースを不整合な状態に残す可能性があります。
  3. プロセスがデータを書き込んでいた場合、データ損失を引き起こす可能性があります。

常にまず SIGTERM を試し、プロセスが SIGTERM に応答しない場合にのみ SIGKILL を使用してください。

高度なプロセス管理

Linux では、基本的な ps コマンドや kill コマンド以外にも、プロセスを管理するための追加コマンドが用意されています。これらのツールを使うと、プロセスの特定や終了をより柔軟かつ便利に行うことができます。

pgrep コマンド

pgrep コマンドを使うと、ps コマンドの出力を目視で確認する必要なく、プロセスを名前で検索できます。

pgrep sleep

このコマンドは、名前に "sleep" が含まれるすべてのプロセスを検索し、その PID を出力します。

pkill コマンド

pkill コマンドは、pgrepkill の機能を組み合わせたものです。プロセスを名前で検索し、それにシグナルを送信します。

## Start two sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
pkill sleep

すべての sleep プロセスが終了したことを確認しましょう。

ps | grep sleep

killall コマンド

killall コマンドは、pkill と同様に、プロセスを名前で終了させます。

## Start two more sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
killall sleep

もう一度確認しましょう。

ps | grep sleep

nicerenice を使ったプロセスの優先度設定

Linux では、nice コマンドと renice コマンドを使って、プロセスの優先度を制御することもできます。

まず、優先度を下げてプロセスを起動してみましょう。

nice -n 10 sleep 300 &

nice 値は -20(最高優先度)から 19(最低優先度)の範囲で設定できます。デフォルト値は 0 です。負の nice 値を設定できるのは root ユーザーのみです。

renice コマンドを使って、プロセスの優先度を変更することもできます。

sleep_pid=$!
echo "Sleep process ID with lower priority: $sleep_pid"
renice -n 15 -p $sleep_pid

新しい優先度を確認しましょう。

ps -o pid,nice,cmd -p $sleep_pid

最後に、このプロセスを終了させます。

kill $sleep_pid

これらのプロセス管理コマンドを使うと、複数のプロセスを効率的に管理し、システムリソースを制御することができます。特に、繁忙なシステムやパフォーマンスの問題をトラブルシューティングする際に便利です。

まとめ

この実験では、システム管理やトラブルシューティングに役立つ重要な Linux のプロセス管理スキルを学びました。

  1. プロセスの識別ps コマンドを使って実行中のプロセスをリストし、そのプロセス ID (PID) を見つける方法を学びました。
  2. プロセスの終了kill コマンドを使って、PID を指定してプロセスに終了シグナルを送信する練習をしました。
  3. キルシグナルの理解:プロセスに送信できるさまざまな種類のシグナルを調べました。これには、正常終了用の SIGTERM (15) や強制終了用の SIGKILL (9) が含まれます。
  4. 高度なプロセス管理pgreppkillkillall などのツールを使って、名前でプロセスを検索して終了させる方法や、nicerenice を使ってプロセスの優先度を設定する方法を学びました。

これらのスキルを使うことで、以下のことができるようになります。

  • システムプロセスを効果的に監視する
  • 応答しないアプリケーションを終了する
  • システムリソースを管理する
  • 問題をトラブルシューティングする

プロセス管理は Linux システム管理の基本的な側面であり、この実験で学んだコマンドは、Linux 管理者やユーザーがシステムのパフォーマンスと安定性を維持するために日常的に使用しています。