Ich habe eine .pid
Datei und muss prüfen, ob der Prozess ausgeführt wird. Bisher habe ich zwei Möglichkeiten gefunden
kill -0 `cat something.pid`
Dies gibt einen Fehler aus, wenn die PID nicht läuft. Ich weiß, dass dies umgeleitet werden kann /dev/null
, aber ich denke, dass dies nicht die beste Lösung ist.
Die zweite Lösung wäre zu verwenden ps
, die aber auch auf dem STDOUT druckt
ps -ef `cat something.pid`
Ist es normal, die Ausgabe umzuleiten /dev/null
und nur den zurückgegebenen Statuscode zu verwenden, oder ist es ein Zeichen dafür, dass ich etwas falsch mache und einen anderen Befehl benötige?
kill -0
gemäß POSIX-Standard.Antworten:
Für die meisten Linux-Distributionen ist die Aufzählung von / proc / {pid} ein guter Weg, um Informationen über die laufenden Prozesse zu erhalten und normalerweise darüber, wie die Userspace-Befehle wie "ps" mit dem Kernel kommunizieren. So können Sie zum Beispiel tun;
Bearbeiten: Sie sollten überprüfen, ob kpid gesetzt ist, aber dies ist nützlicher, da es für unset $ {kpid} "nicht existiert" zurückgibt.
quelle
${kpid}
vorhandenWie Anders bemerkte, sollten Sie
kill -0
für die POSIX-Konformität verwenden.Auf Linux-Systemen können Sie auch prüfen, ob eine Datei im Dateisystem / proc vorhanden ist, z.
quelle
Wenn dies in einem Skript enthalten ist (was meiner Meinung nach der Fall ist, da Sie Bedenken haben, auf stdout zu drucken), können Sie dies folgendermaßen tun:
Das
ps -p
sucht nach einem Prozess mit der in something.pid angegebenen$()
PID (die Syntax ist eine etwas neuere Version des Backtick. Backtick muss unter bestimmten Umständen maskiert werden, was das neue Formular nicht tut). Die2>&1
Weiterleitungen stderr auch für diesen Befehl.Wenn der
ps -p
Befehl den Prozess mit dieser PID nicht findet, wird er mit einem Fehler> 0 beendet undelse
ausgeführt. Ansonsten diekill
Aussage. Sie können das oben Gesagte negieren, indem Sie Folgendes tun:Hoffe das beantwortet deine Frage. Seien Sie natürlich vorsichtig und testen Sie viel, wenn Sie gefährliche Befehle wie
kill
.quelle
Hier sind einige Optionen:
/etc/init.d/
Sie es einfügen möchten) und eine Debian-basierte Distribution verwenden, sollten Sie Folgendes verwendenstart-stop-daemon
: Sie sollten den Exit-Code 0 erhalten, wenn er ausgeführt wird.procps
Paket verwenden:quelle
Wenn Sie eine PID-Datei haben, können Sie mit pgrep prüfen, ob der Prozess ausgeführt wird:
quelle