如何检查 pid X 的进程是否是您期望的进程

如何检查 pid X 的进程是否是您期望的进程

在我们的应用程序中,我们启动一些后台进程。这些进程的 pid 被保存到一个文件中。

当达到最大值或系统重新启动时,将重新使用 pids 值。

如何可靠地检查 pid X 的进程是否仍然是存储 X 的进程。

我读了 https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-runninghttps://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

相关内容