pid Xを持つプロセスが予想されるプロセスであることを確認する方法

pid Xを持つプロセスが予想されるプロセスであることを確認する方法

私たちのアプリケーションはいくつかのバックグラウンドプロセスを始めます。これらのプロセスの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

関連情報