関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。周りに知らない人が結構いたので、そのためのメモも兼ねて。
業務で、サーバ側(Linux)で特定のプロセスが生存しているかどうかを確認したり、プロセスが死んだら何かをするという作業が結構あります。
大抵はシェルスクリプトなどで実装したりすることが多いのですが、その際に ps コマンドでやってる人が結構多かったりします。
確認方法としてはいろいろありますが、たいてい以下の4つのどれかになるでしょう。
- kill -0
- ps -p
- /proc/PID
- pgrep -q
上記のどの方法でもプロセスが生存しているのかは確認できます。
んで、この中で最速なものは何か?ってなると
kill -0
です。kill -0 は、シグナル0(ヌルシグナル)をプロセスに送信します。ヌルシグナルはプロセスに一切何も影響を与えないシグナルで、且つ、システムコール一発で完結します。(kill(pid, 0)がカーネルレベルのシステムコールで呼び出される)
なので、これが一番速いし効率が良いです。逆に ps と pgrep はコマンドを別途起動することになることに加えて、プロセステーブルも舐めて確認する処理となるので、速度的には上記の4つの中では下位です。
まあ、カリカリに速度が必要な場面ってそんなに無いのですが、もしかしたら知ってると幸せになるときが来るかも知れません。
サンプル
kill -0
# 確認1 if kill -0 $PID 2>/dev/null; then echo "プロセス $PID は実行中です" else echo "プロセス $PID は存在しません" fi
# 確認2 if ! kill -0 $PID 2>/dev/null; then echo "エラー: プロセス $PID が見つかりません" exit 1 fi
# 確認3 while kill -0 $PID 2>/dev/null; do echo "プロセス $PID を監視中..." sleep 5 done echo "プロセス $PID が終了しました"
ps -p
if ! ps -p $PID > /dev/null 2>&1; then echo "エラー: プロセス $PID が見つかりません" exit 1 fi
/proc/PID
if [ ! -d "/proc/$PID" ]; then echo "エラー: プロセス $PID が見つかりません" exit 1 fi
pgrep -q
if ! pgrep -q "^$PID$"; then echo "エラー: プロセス $PID が見つかりません" exit 1 fi
シンプルな起動確認スクリプト
すごくシンプルにするとこんな感じですね。実務で使うにはいろいろ足りてませんが。(タイムアウト時の動きとか、プロセスは起動したけどちゃんとREADYになったかどうかの確認とか)
#!/bin/bash start_application() { local app_name="$1" local max_wait=30 local wait_count=0 if [ -z "$app_name" ]; then echo "エラー: アプリケーション名が指定されていません" return 1 fi "$app_name" & local app_pid=$! if [ -z "$app_pid" ]; then echo "エラー: PID取得失敗" return 1 fi echo "アプリケーション起動中... (PID: $app_pid)" while [ $wait_count -lt $max_wait ]; do if kill -0 "$app_pid" 2>/dev/null; then echo "アプリケーション起動完了 (PID: $app_pid)" return 0 fi sleep 1 ((wait_count++)) done echo "エラー: アプリケーション起動失敗またはタイムアウト" return 1 } if [ $# -eq 0 ]; then echo "使用法: $0 <アプリケーション名>" exit 1 fi start_application "$1"
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。