高度なプロセス終了オプション
このステップでは、より洗練されたプロセス管理を可能にする 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 コマンド自体のみが表示されるはずです。
このように所有者によってプロセスをターゲット指定できる機能は、他のユーザーに属するプロセスに影響を与えたくないマルチユーザー環境で特に役立ちます。