
私は RHEL 7.5 を使用しており、PID 番号を含むファイルを含む Java プログラムがあります。プロセスが強制終了されても、ファイルは引き続き存在するため、そのファイルに保存されている PID が生きているかどうかを検証するスクリプトを実行していますが、疑問や問題があります。
PID 445 と 2445 が存在します。では、445 だけを取得するにはどうすればよいでしょうか?
次のコマンドを試しました:
ps -ax | egrep "^ 445"
しかし、何も返ってきませんでした。
2 つのプロセス:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
答え1
使用-p
:
-p proclist
プロセス ID 番号が指定されているプロセスの情報を書き込みますproclist
。 […]
(ソース)
あなたの場合:
ps -p 445
POSIXではps
、「エラーが発生した」場合は肯定的な終了ステータスを返す必要があるとps
されています。私がテストしたすべてのproclist
ケースでは、既存 処理を「エラー」として処理します。これは便利です。例:
ps -p 445 >/dev/null && echo "Process exists."
ノート:
- 終了したプロセスのPIDは最終的に再利用される可能性がありますしたがって、PID が使用中であっても、それが目的のプロセスではない可能性があります。
- ファイル内の PID が最近の (再) ブート前のものである場合、その PID が現在使用中であっても、プロセスは明らかに存在しません。(ヒント:ファイルがオンになるようにプログラムを設定する
tmpfs
)。
答え2
次のようにして、Bash スクリプトでプロセスが実行中かどうかを確認できますkill -0
。
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
は${pid_file}
、PID を含むファイル パスに相当します。 は、-f ${pid_file}
PID ファイルが存在するかどうかを確認します。 次に、kill -0 $(cat ${pid_file})
プロセスが実行中かどうかを確認します。
つまり、次のようになります。
- プロセスが実行中の場合は、スクリプトを終了するだけで何もしません。
- それ以外の場合(プロセスがない実行中の場合は、PID ファイルを削除するだけです。
の魔法については、kill -0
manページで説明されています。kill
:
もし署名0 の場合、シグナルは送信されませんが、エラー チェックは実行されます。これを使用して、プロセス ID またはプロセス グループ ID の存在を確認できます。