高度なプロセス終了オプション
このステップでは、より高度なプロセス管理を可能にする 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
各シグナルについて、プロセスが終了する前に、対応するメッセージがターミナル出力に表示されるはずです。
プロセスの起動時間に基づく終了
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
コマンド自体のみが表示されるはずです。
このように、所有者によってプロセスを対象とする機能は、他のユーザーのプロセスに影響を与えないようにする必要があるマルチユーザー環境で特に有用です。