pid X のプロセスが期待どおりのものかどうかを確認する方法

pid X のプロセスが期待どおりのものかどうかを確認する方法

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

関連情報