
私たちのアプリケーションはいくつかのバックグラウンドプロセスを始めます。これらのプロセスのPIDはファイルに保存されます。
pids の値は、最大値に達した場合、またはシステムが再起動すると再利用されます。
pid Xを持つプロセスがまだXが保存されているプロセスであることを確実に確認する方法
私は読んだ https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-running そしてhttps://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists ただし、これらのソリューションは、pid Xを持つプロセスがpidが保存されているプロセスとまだ同じプロセスであるかどうかを確認しません。
確実に実行するには、この情報が必要です。
- プロセスがまだ実行中であることを確認してください。
- 現在pid Xを持つ他のプロセスを終了する危険なしにプロセスを終了します。
関連https://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris
現在のソリューションを公開します。これが合理的なアプローチかどうか、より良い方法があるかどうか疑問に思います。
答え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