はじめに
Linux システムにおいて、プロセスを効果的に管理することは、システムの安定性とパフォーマンスを維持するために重要です。kill コマンドを使用すると、特定のプロセス ID (PID) を指定してプロセスを終了できますが、パターンに基づいて複数のプロセスを終了する必要がある場合もあります。このような場合に pkill コマンドが役立ちます。
この実験では、pkill コマンドを使用して、プロセス名、引数、またはその他の基準に基づいてプロセスを終了する方法に焦点を当てます。実行中のプロセスを特定し、パターンマッチングを使用して選択的にプロセスを終了し、操作結果を確認する方法を学びます。これらのスキルは、Linux 環境におけるシステム管理とトラブルシューティングに不可欠です。
プロセス管理と基本的なプロセス終了の理解
この最初のステップでは、実行中のプロセスを特定し、基本的なパターンマッチングを使用してそれらを終了する方法を探ります。Linux では、ps、pgrep、pkill など、プロセス管理用のいくつかのコマンドが用意されています。
テスト用プロセスの作成
まず、バックグラウンドプロセスとして実行できる簡単なスクリプトを作成しましょう。いくつかの類似したプロセスを終了する必要があるシナリオをシミュレートするために、このスクリプトの複数のインスタンスを作成します。
まず、プロジェクトディレクトリに移動し、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 &
それでは、プロセスに異なるシグナルを送信してみましょう。
- SIGHUP シグナル(シグナル 1)を送信します。
pkill -HUP -f signal_handler.sh
- スクリプトを再度起動し、SIGINT(シグナル 2)を送信します。
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- スクリプトを再度起動し、デフォルトの SIGTERM(シグナル 15)を送信します。
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM
各シグナルについて、プロセスが終了する前にターミナル出力に対応するメッセージが表示されるはずです。
プロセスの生存期間(Age)による終了
pkill は、--newest オプションを使用してプロセスの起動時期に基づいてターゲットを絞ることを可能にします。このオプションは、最も新しく起動されたプロセスを選択します。
異なる起動時間を持つプロセスをいくつか作成してみましょう。
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 &
数秒待ってから、さらに 2 つのプロセスを起動します。
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
ここで、--newest オプションを使用して、最も新しく起動された 2 つのプロセスのみを終了させてみましょう。
pkill -f --newest 2 age_test.sh
どのプロセスがまだ実行中かを確認します。
ps aux | grep age_test.sh
最初のプロセスのみが実行中であることが確認できるはずです。これは、他の 2 つのプロセスよりも先に起動されたためです。
残りのプロセスを終了します。
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 コマンドを使用してプロセスを管理する方法を学びました。この強力なコマンドを使用すると、様々な基準に基づいてプロセスを終了できるため、システム管理に欠かせないツールとなっています。
カバーされた主要な概念は以下の通りです。
基本的なプロセス終了:
psコマンドを使用して実行中のプロセスを識別し、基本的なパターンマッチングを使用してpkillでそれらを終了する方法を学びました。選択的なプロセス終了:コマンドライン引数に基づいてプロセスを選択的に対象とするためにパターンマッチングを使用する方法を探り、終了するプロセスを正確に制御できるようになりました。
高度なプロセス終了オプション:
pkillの高度なオプションを発見しました。具体的には以下のことができるようになりました。- 異なるシグナルタイプをプロセスに送信する
- プロセスの起動時間に基づいてプロセスを終了する
pkillの対象を特定のユーザーが所有するプロセスに制限する
これらのスキルは、Linux 環境でのシステムの安定性の維持、リソースの管理、トラブルシューティングに役立ちます。pkill コマンドを習得することで、Linux システム管理のツールキットに重要なツールを追加したことになります。



