私たちのアプリケーションでは、いくつかのバックグラウンド プロセスを開始します。これらのプロセスの pid はファイルに保存されます。
最大値に達したとき、またはシステムが再起動されたときに、pids 値が再利用されます。
pid X のプロセスが、X が保存されたプロセスと同じプロセスであることを確実に確認するにはどうすればよいでしょうか。
もう読んだ https://serverfault.com/questions/366474/pid が実行中かどうかを確認する適切な方法 そしてhttps://stackoverflow.com/questions/3043978/プロセス ID の PID が存在するかどうかを確認する方法 しかし、これらのソリューションでは、pid X を持つプロセスが、その pid が保存されたプロセスと同じプロセスであるかどうかはチェックされません。
この情報を確実に得るために
- プロセスがまだ実行中であることを確認する
- 現在pid Xを持つ別のプロセスを強制終了するリスクを冒さずにプロセスを強制終了する
関連しているhttps://serverfault.com/questions/279178/linux および solaris の pid の範囲は何ですか?
現在の解決策を投稿します。これが賢明なアプローチであるかどうか、また、これを行うより良い方法があるかどうかを知りたいです。
答え1
私はこれに対して次のソリューションを作成しました
私のスタートスクリプトには
nohup $commandline >> $TEMP/logfile 2>&1 &
MYPID=$!
echo $MYPID > pidfile
cat /proc/$MYPID/cmdline >> pidfile
私の停止スクリプトはpidfileを読み取り、cmdlineが元々保存されたものと一致しているかどうかを確認します。
[ -f pidfile ] || { echo no pidfile; exit 1; }
read pid < pidfile
psatstart=$(tail -1 pidfile)
psnow=$(</proc/$pid/cmdline)
if [[ "$psnow" == "$psatstart" ]]
then
echo kill $pid
kill $pid || { echo kill $pid failed; exit 2; }
while ps -p $pid
do
sleep 1
done
else
echo pid $pid not the same, assume already ended
echo S $psatstart
echo N $psnow
fi
rm pidfile