Linux のパターンベースのプロセス終了

LinuxLinuxBeginner
今すぐ練習

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

はじめに

Linux システムにおいて、プロセスを効果的に管理することは、システムの安定性とパフォーマンスを維持するために重要です。kill コマンドを使用すると、特定のプロセス ID (PID) を指定してプロセスを終了できますが、パターンに基づいて複数のプロセスを終了する必要がある場合もあります。このような場合に pkill コマンドが役立ちます。

この実験では、pkill コマンドを使用して、プロセス名、引数、またはその他の基準に基づいてプロセスを終了する方法に焦点を当てます。実行中のプロセスを特定し、パターンマッチングを使用して選択的にプロセスを終了し、操作結果を確認する方法を学びます。これらのスキルは、Linux 環境におけるシステム管理とトラブルシューティングに不可欠です。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/ProcessManagementandControlGroup -.-> linux/pkill("Pattern-Based Killing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") subgraph Lab Skills linux/chmod -.-> lab-271359{{"Linux のパターンベースのプロセス終了"}} linux/grep -.-> lab-271359{{"Linux のパターンベースのプロセス終了"}} linux/pkill -.-> lab-271359{{"Linux のパターンベースのプロセス終了"}} linux/ps -.-> lab-271359{{"Linux のパターンベースのプロセス終了"}} end

プロセス管理と基本的なプロセス終了の理解

この最初のステップでは、実行中のプロセスを特定し、基本的なパターンマッチングを使用してそれらを終了する方法を探ります。Linux では、pspgreppkill など、プロセス管理用のいくつかのコマンドが用意されています。

テスト用プロセスの作成

まず、バックグラウンドプロセスとして実行できる簡単なスクリプトを作成しましょう。いくつかの類似したプロセスを終了する必要があるシナリオをシミュレートするために、このスクリプトの複数のインスタンスを作成します。

まず、プロジェクトディレクトリに移動し、rogue_app.sh という名前のスクリプトを作成します。

cd ~/project
nano rogue_app.sh

スクリプトに以下の内容を追加します。

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

このスクリプトは無限ループを実行し、5 秒ごとに自身のプロセス ID (PID) を出力します。

次に、スクリプトを実行可能にします。

chmod +x ~/project/rogue_app.sh

このスクリプトの複数のインスタンスをバックグラウンドで実行しましょう。

for i in {1..5}; do
  ~/project/rogue_app.sh &
done

コマンドの末尾の & は、各スクリプトインスタンスをバックグラウンドで実行し、ターミナルを引き続き使用できるようにします。

実行中のプロセスの表示

先ほど起動したプロセスを表示するには、適切なフラグを指定して ps コマンドを使用します。

ps aux | grep rogue_app.sh

出力は次のようになります。

labex     12345  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12346  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12347  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12348  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12349  0.0  0.0   2308   580 pts/0    S    10:00   0:00 /bin/bash /home/labex/project/rogue_app.sh
labex     12350  0.0  0.0   2432   584 pts/0    S+   10:00   0:00 grep --color=auto rogue_app.sh

実際の PID (2 列目の数字) は、あなたのシステムでは異なる場合があります。

pkill でプロセスを終了する

では、pkill コマンドを使用して、スクリプトのすべてのインスタンスを終了しましょう。

pkill -f rogue_app.sh

-f オプションは、pkill に対して、プロセス名だけでなく、完全なコマンドラインとのマッチングを行うよう指示します。これは、スクリプトが実行されるとき、プロセス名はしばしばインタープリタ (例: /bin/bash) であり、スクリプト名ではないため重要です。

スクリプトのすべてのインスタンスが終了したことを確認します。

ps aux | grep rogue_app.sh

出力には、grep コマンド自体のみが表示されるはずです。

labex     12351  0.0  0.0   2432   584 pts/0    S+   10:01   0:00 grep --color=auto rogue_app.sh

これにより、rogue_app.sh のすべてのインスタンスが正常に終了したことが確認できます。

パターンマッチングによる選択的なプロセス終了

実際のシナリオでは、終了するプロセスをより選択的に指定する必要があることがよくあります。pkill コマンドを使用すると、様々な基準に基づいて特定のプロセスを対象とするためにパターンマッチングを利用できます。

異なる引数でプロセスを作成する

異なるコマンドライン引数で実行する新しいスクリプトを作成しましょう。

cd ~/project
nano service_worker.sh

スクリプトに以下の内容を追加します。

#!/bin/bash
while true; do
  echo "Running service worker with argument: $1"
  sleep 5
done

スクリプトを実行可能にします。

chmod +x ~/project/service_worker.sh

では、異なる引数でこのスクリプトの複数のインスタンスを実行しましょう。

~/project/service_worker.sh normal &
~/project/service_worker.sh normal &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh --malfunctioning &
~/project/service_worker.sh emergency &

これにより、5 つのバックグラウンドプロセスが作成されます。2 つの「通常」のワーカー、2 つの「故障中」のワーカー、そして 1 つの「緊急」のワーカーです。

異なる引数のプロセスを表示する

実行中のプロセスを確認します。

ps aux | grep service_worker.sh

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

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12362  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12363  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh --malfunctioning
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12365  0.0  0.0   2432   584 pts/0    S+   10:05   0:00 grep --color=auto service_worker.sh

パターンマッチングによる選択的な終了

では、--malfunctioning 引数を持つプロセスのみを選択的に終了しましょう。

pkill -f "service_worker.sh --malfunctioning"

-f オプションは、pkill が引数を含む完全なコマンドラインとのマッチングを行うことを保証します。

対象のプロセスのみが終了したことを確認します。

ps aux | grep service_worker.sh

これで、「通常」と「緊急」のプロセスのみが表示されるはずです。

labex     12360  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12361  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh normal
labex     12364  0.0  0.0   2308   580 pts/0    S    10:05   0:00 /bin/bash /home/labex/project/service_worker.sh emergency
labex     12366  0.0  0.0   2432   584 pts/0    S+   10:06   0:00 grep --color=auto service_worker.sh

これは、コマンドラインの特定のパターンに基づいてプロセスを選択的に終了できることを示しています。

では、残りのすべてのサービスワーカープロセスを終了しましょう。

pkill -f service_worker.sh

すべてのサービスワーカープロセスが終了したことを確認します。

ps aux | grep service_worker.sh

これで、grep コマンド自体のみが表示されるはずです。

labex     12367  0.0  0.0   2432   584 pts/0    S+   10:07   0:00 grep --color=auto service_worker.sh

高度なプロセス終了オプション

このステップでは、より高度なプロセス管理を可能にする pkill コマンドのいくつかの高度なオプションを探ります。

異なるシグナルタイプの使用

デフォルトでは、pkill は SIGTERM シグナル(シグナル 15)をプロセスに送信します。このシグナルにより、プロセスは正常に終了し、ファイルを閉じ、クリーンアップ操作を実行できます。ただし、異なるシグナルを使用したい場合もあります。

シグナルを処理するスクリプトを作成しましょう。

cd ~/project
nano signal_handler.sh

スクリプトに以下の内容を追加します。

#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM

echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
  sleep 1
done

スクリプトを実行可能にします。

chmod +x ~/project/signal_handler.sh

スクリプトをバックグラウンドで実行します。

~/project/signal_handler.sh &

では、異なるシグナルをプロセスに送信してみましょう。

  1. SIGHUP シグナル(シグナル 1)を送信します。
pkill -HUP -f signal_handler.sh
  1. スクリプトを再度起動し、SIGINT(シグナル 2)を送信します。
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
  1. スクリプトを再度起動し、デフォルトの SIGTERM(シグナル 15)を送信します。
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM

各シグナルについて、プロセスが終了する前に、対応するメッセージがターミナル出力に表示されるはずです。

プロセスの起動時間に基づく終了

pkill では、--newer--older オプションを使用して、プロセスの起動時間に基づいて対象のプロセスを指定できます。

異なる起動時間でいくつかのプロセスを作成しましょう。

cd ~/project
nano age_test.sh

スクリプトに以下の内容を追加します。

#!/bin/bash
while true; do
  echo "Process running with PID $$"
  sleep 5
done

スクリプトを実行可能にします。

chmod +x ~/project/age_test.sh

最初のプロセスを起動し、基準ファイルを作成します。

~/project/age_test.sh &
touch ~/project/reference_time

数秒待ってから、さらに 2 つのプロセスを起動します。

sleep 5
~/project/age_test.sh &
~/project/age_test.sh &

では、基準ファイルが作成された後に起動されたプロセスのみを終了しましょう。

pkill -f --newer ~/project/reference_time age_test.sh

どのプロセスがまだ実行中かを確認します。

ps aux | grep age_test.sh

基準ファイルが作成される前に起動された最初のプロセスのみがまだ実行中であることがわかるはずです。

残りのプロセスを終了します。

pkill -f age_test.sh

プロセスの所有者で pkill を制限する

pkill の操作を特定のユーザーが所有するプロセスに制限することもできます。マルチユーザーシステムでは、これは特に有用です。

デモンストレーションのために、現在のユーザーとしていくつかのプロセスを実行しましょう。

~/project/rogue_app.sh &
~/project/rogue_app.sh &

では、これらのプロセスのうち、現在のユーザーが所有するもののみを終了しましょう。

pkill -f -u $(whoami) rogue_app.sh

-u オプションは、プロセスの所有者のユーザー名を指定します。$(whoami) コマンド置換は、現在のユーザー名を取得します。

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

ps aux | grep rogue_app.sh

出力には、grep コマンド自体のみが表示されるはずです。

このように、所有者によってプロセスを対象とする機能は、他のユーザーのプロセスに影響を与えないようにする必要があるマルチユーザー環境で特に有用です。

まとめ

この実験では、Linux 環境で pkill コマンドを使用してプロセスを管理する方法を学びました。この強力なコマンドを使用すると、様々な基準に基づいてプロセスを終了できるため、システム管理に欠かせないツールとなっています。

カバーされた主要な概念は以下の通りです。

  1. 基本的なプロセス終了ps コマンドを使用して実行中のプロセスを識別し、基本的なパターンマッチングを使用して pkill でそれらを終了する方法を学びました。

  2. 選択的なプロセス終了:コマンドライン引数に基づいてプロセスを選択的に対象とするためにパターンマッチングを使用する方法を探り、終了するプロセスを正確に制御できるようになりました。

  3. 高度なプロセス終了オプションpkill の高度なオプションを発見しました。具体的には以下のことができるようになりました。

    • 異なるシグナルタイプをプロセスに送信する
    • プロセスの起動時間に基づいてプロセスを終了する
    • pkill の対象を特定のユーザーが所有するプロセスに制限する

これらのスキルは、Linux 環境でのシステムの安定性の維持、リソースの管理、トラブルシューティングに役立ちます。pkill コマンドを習得することで、Linux システム管理のツールキットに重要なツールを追加したことになります。