在我们的应用程序中,我们启动一些后台进程。这些进程的 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