Überprüfen Sie, ob ein Prozess ausgeführt wird, wenn nicht, führen Sie ihn erneut im Terminal aus

Gibt es eine Möglichkeit, regelmäßig zu überprüfen, ob ein Prozess mit (wahrscheinlich mit Apple-Skript oder einem anderen Shell-Skript) ausgeführt wird, und wenn nicht, ihn im Terminal auszuführen?

Ich habe ein PHP-Skript, das ausgeführt werden muss, aber nach einiger Zeit bricht es ab, also muss ich es erneut starten.

Danke.

Antworten (3)

Verwenden Sie unter OSX dazu launchd. launchd startet einen Befehl beim Anmelden oder Booten und wenn der Prozess stirbt, wird er neu gestartet.

Der Prozess wird durch eine .plist-Datei gesteuert , die wie in der Apple-Dokumentation definiert formatiert ist. Das Beispiel auf dieser Handbuchseite ist für den von Ihnen gewünschten Fall.

  <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
   http://www.apple.com/DTDs/PropertyList-1.0.dtd >
   <plist version="1.0">
   <dict>
        <key>Label</key>
        <string>com.example.exampled</string>
        <key>ProgramArguments</key>
        <array>
             <string>exampled</string>
        </array>
        <key>KeepAlive</key>
        <true/>
   </dict>
   </plist>

Wenn Sie starten möchten, wenn sich ein Benutzer anmeldet, geht diese Datei in ~/Library/LaunchAgents. Wenn beim Booten des Computers /Library/LaunchDaemons (das keinen Zugriff auf die GUI haben kann) dies jedoch als Root ausgeführt wird, es sei denn, Sie fügen einen UserName-Schlüssel hinzu. (Dank an @Gordon Davisson für die Korrektur und ein erneutes Lesen der Apple-Definitionen )

Um die Einrichtung der .plist zu vereinfachen, können Sie Lingon.app verwenden , die im Mac AppStore erhältlich ist

Korrektur: Um es beim Booten auszuführen, legen Sie die Datei in /Library/LaunchDaemons.
@jherran siehe Meta und viele im Meta-Stack-Überlauf - verwenden Sie keine Codeformatierung im Klartext nur für Code

Wenn Sie dies über ein Shell-Skript tun wollten, würde ich so etwas tun:

#!/bin/sh
PROCESS=`ps A | grep PROCESS_NAME | grep -v grep`
if [ "$?" -ne "0" ]; then
        echo "not running"
        ### COMMAND TO EXECUTE HERE ###
        exit 1
fi

Sie könnten das etwa jede Minute über cron aufrufen .

Warum müssen Sie das Skript aktiv abfragen? Warum stecken Sie es nicht einfach in eine Shell-Skriptschleife und starten es neu, wenn es fehlschlägt.

#!/bin/sh

let c=1
while ! php -f myscript.php; do
    echo "The script has crashed $c times so far..."
    let "c=c+1"
done

Für den Fall, dass es nicht ordnungsgemäß fehlschlägt, wird Sie auch das Abfragen für einen laufenden Prozess nicht retten. Es kann genauso gut weiterlaufen, ohne seine Arbeit zu tun.