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