So prüfen Sie, ob der Prozess mit PID X der erwartete ist

So prüfen Sie, ob der Prozess mit PID X der erwartete ist

In unserer Anwendung starten wir einige Hintergrundprozesse. Die PID dieser Prozesse wird in einer Datei gespeichert.

PID-Werte werden wiederverwendet, wenn das Maximum erreicht ist oder das System neu gestartet wird.

Wie kann ich zuverlässig überprüfen, ob der Prozess mit der PID X noch derselbe Prozess ist, für den X gespeichert wurde?

Ich habe gelesen https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-running Undhttps://stackoverflow.com/questions/3043978/wie-man-überprüft-ob-eine-prozess-id-pid-exists Diese Lösungen überprüfen jedoch nie, ob der Prozess mit der PID X immer noch derselbe Prozess ist, für den die PID gespeichert wurde.

Ich brauche diese Informationen, um zuverlässig

  • Überprüfen Sie, ob der Prozess noch ausgeführt wird
  • Beenden Sie den Prozess, ohne das Risiko einzugehen, einen anderen Prozess zu beenden, der jetzt die PID X hat.

verwandthttps://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris

Ich werde meine aktuelle Lösung posten. Ich würde gerne wissen, ob das ein sinnvoller Ansatz ist und ob es bessere Möglichkeiten gibt, dies zu tun.

Antwort1

Ich habe hierfür folgende Lösung erstellt

Mein Startskript enthält

nohup $commandline >> $TEMP/logfile 2>&1 &
MYPID=$!
echo $MYPID > pidfile
cat /proc/$MYPID/cmdline >> pidfile

Mein Stoppskript liest die Pid-Datei und prüft, ob die Befehlszeile der ursprünglich gespeicherten entspricht

[ -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

verwandte Informationen