Dies kann schwierig sein, da Sie separate Instanzen desselben Prozesses haben können, die unabhängig voneinander ausgeführt werden. Zum Beispiel Server, die verschiedene Ports abhören, oder Dienste, die als verschiedene Benutzer ausgeführt werden. Um zwischen diesen Instanzen zu unterscheiden, müssen Sie jeder Instanz ein eindeutiges Tag zuweisen. Das Tag ist häufig eine Datei, kann jedoch ein lokaler Socket im abstrakten Namespace, ein TCP-Port usw. sein - jede eindeutige Kennung reicht aus. Wenn es sich bei dem Tag um eine Datei handelt, kann es sich um eine reguläre Datei handeln, die eine Prozess-ID (eine PID-Datei) oder eine Named Pipe oder einen Socket enthält, den die Datei abhört usw. Im Idealfall ist das Tag ein Kommunikationsendpunkt, über den Clients eine Verbindung herstellen können zu diesem Prozess.
Jede dieser verschiedenen Arten von Tags führt zu einer unterschiedlichen Überprüfung, ob die gesuchte Instanz aktiv ist. Versuchen Sie beispielsweise mit einem lokalen Dateisocket, eine Verbindung zu diesem herzustellen, und starten Sie den Prozess, wenn dieser Socket nicht überwacht wird. Wenn es sich bei dem Tag um eine PID-Datei handelt, überprüfen Sie, ob es einen Prozess mit dieser Prozess-ID gibt. Beachten Sie jedoch, dass dieser fragil ist. Wenn der Prozess gestorben ist, gibt es möglicherweise einen nicht verwandten Prozess, der seine ID wiederverwendet hat. Beachten Sie, dass zwei Clients, die versuchen, den Prozess in kurzer Zeit zu erreichen, möglicherweise feststellen, dass der Prozess nicht vorhanden ist, und beide versuchen, ihn zu starten. Ein angemessener Schutz vor diesen Rennbedingungen kann schwierig sein.
Es ist einfacher, Instanzen zu verwalten, wenn sie alle vom selben Supervisor-Prozess gestartet werden, und dieser Supervisor-Prozess erkennt, wenn Instanzen sterben, und reagiert entsprechend. Viele Dienstüberwachungsprogramme , die dies tun können.
Wenn das Programm nicht auf einen bekannten Kommunikationsendpunkt reagiert und nicht von einem Supervisor-Programm verwaltet wird, ist das Tag des armen Mannes eine PID-Datei: eine Datei mit der Prozess-ID. Wenn Sie den Vorgang starten, schreiben Sie die PID in eine Datei mit einem festgelegten Namen. Wenn der Prozess vorhanden sein muss, lesen Sie die PID-Datei und prüfen Sie, ob es einen Prozess mit dieser PID gibt. Wenn Sie den Prozess beenden, löschen Sie die PID-Datei. Das auffälligste Problem bei einer unbeaufsichtigten PID-Datei ist, dass wenn der Prozess stirbt, die PID von einem nicht verwandten Prozess wiederverwendet werden kann. Sie sollten mindestens den Prozessnamen oder die ausführbare Prozessdatei überprüfen, um sicherzustellen, dass Sie mit dem richtigen Prozess sprechen. Viele Unix-Varianten haben einen pgrep- Befehl:pgrep SOMENAME
listet die Prozesse auf, deren Name SOMENAME als Teilzeichenfolge enthält, mit zusätzlichen Optionen, um sie auf einen bestimmten Benutzer zu beschränken, eine genaue Übereinstimmung zu verlangen, um zu ändern, welche der verschiedenen möglichen Begriffe „Prozessname“ verwendet wird usw.
ps -ef | grep -v grep | grep "process_name" || run_command_here