Ich schreibe ein Perl-Skript, das Protokolldateien analysiert, um PIDs zu sammeln, und dann prüft, ob diese PID ausgeführt wird. Ich versuche, mir den besten Weg zu überlegen, um diesen Scheck zu machen. Offensichtlich könnte ich etwas machen wie:
system("ps $pid > /dev/null") && print "Not running\n";
Ich würde es jedoch vorziehen, den Systemaufruf nach Möglichkeit zu vermeiden. Ich dachte daher, ich könnte das /proc
Dateisystem verwenden (Portabilität ist kein Problem, dies wird immer auf einem Linux-System ausgeführt). Beispielsweise:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Ist das sicher? Kann ich immer davon ausgehen, dass /proc/$pid/
die zugehörige PID nicht ausgeführt wird , wenn kein Verzeichnis vorhanden ist? Ich gehe davon aus, dass AFAIK ps
selbst /proc
sowieso seine Informationen erhält, aber da es sich um Seriencode handelt, möchte ich sicher gehen.
Kann es also Fälle geben, in denen ein laufender Prozess kein /proc/PID
Verzeichnis hat oder in denen ein /proc/PID
Verzeichnis existiert und der Prozess nicht läuft? Gibt es einen Grund, das Parsen der ps
Überprüfung auf das Vorhandensein des Verzeichnisses vorzuziehen ?
kill -0
der besten) Methode nur angezeigt wird, ob ein Prozess mit der angegebenen PID ausgeführt wird . Es sagt Ihnen nicht, ob der Prozess eine Millisekunde später noch ausgeführt wird, und es sagt Ihnen nicht, ob der Prozess derjenige ist, an dem Sie interessiert sind, oder ein nicht verwandter Prozess, dem nach dem Abbruch des interessanten Prozesses dieselbe PID zugewiesen wurde . Es ist fast immer ein Fehler zu testen, ob eine bestimmte PID ausgeführt wird : Es gibt nur sehr wenige Umstände, unter denen dies nicht für Rennbedingungen anfällig ist.
kill
Funktion mit dem Signal 0, die keine Tötung durchführt, aber angibt, ob Sie dies tun könnten (dh Sie benötigen die Erlaubnis, diesen Prozess zu signalisieren).