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 /procDateisystem 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 psselbst /procsowieso 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/PIDVerzeichnis hat oder in denen ein /proc/PIDVerzeichnis existiert und der Prozess nicht läuft? Gibt es einen Grund, das Parsen der psÜberprüfung auf das Vorhandensein des Verzeichnisses vorzuziehen ?
kill -0der 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.
killFunktion 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).