Wenn Sie ein Bash-Skript erstellen, das ein Programm ausführt und es ohne Absturz beendet, wird es erneut ausgeführt

8

Ich möchte wissen, wie man am einfachsten ein Bash-Skript erstellt, mit dem eine App unter MacOSX ausgeführt wird (es ist ein UNIX-basiertes System, daher habe ich angenommen, dass dies der richtige Ort ist). Warten Sie, bis das Programm beendet ist. Wenn der Ausgang kein Absturz war, führen Sie ihn erneut aus. Andernfalls lassen Sie das Fenster für den Absturzbericht geöffnet und beenden Sie das Fenster.

Ich möchte, dass dieses Skript für immer ausgeführt wird, bis es abstürzt oder manuell beendet wird.

Ich habe eine vage Idee, bin mir aber nicht sicher. Folgendes habe ich bisher:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi
Ben hat Euden verrückt gemacht
quelle
Sie möchten fast definitiv nicht, dass ein Skript aus irgendeinem Grund für immer ausgeführt wird. Sie möchten, dass ein Dienst - oder ein Dämon - für immer ausgeführt wird. Ich weiß nicht, wie sie es bei Äpfeln machen, aber Sie sollten sich Ihr Init-System wahrscheinlich etwas genauer ansehen, um herauszufinden, ob es eine Möglichkeit gibt, einen Dienst bei ihm zu registrieren. Normalerweise überprüfen sich Dämonen regelmäßig, um den Status zu aktualisieren / zu speichern - sie werden nicht wirklich für immer wiederholt.
Mikeserv

Antworten:

12

Dies ist, was Bash while-Schleifen tun:

while /path/to/application.app
do
    :
done

Die Anwendung wird ausgeführt, und wenn sie erfolgreich beendet wird, wird der Hauptteil der Schleife ausgeführt. :ist der No-Op-Befehl der Shell (die Schleife muss einen Body haben, also setzen wir das dort ein); Danach geht es zurück nach oben und führt das Programm erneut aus. Wenn dies fehlschlägt, wird die Schleife nicht mehr ausgeführt und das Skript wird beendet.

Es sieht jedoch so aus, als ob Sie eine normale Mac-Anwendung ausführen ( .app): In diesem Fall treten einige Probleme auf. Zum einen müssen Sie den openBefehl verwenden , anstatt das Anwendungsverzeichnis direkt auszuführen : open /path/to/application.app.

Das andere ist, dass wenn Sie dies tun open, dies normalerweise sofort mit Erfolg beendet wird, unabhängig davon, was die Anwendung tut: Das ist nicht absolut universell, aber die meisten werden es tun. Wenn dies der Fall ist, können Sie die -WOption verwenden, um opendas Blockieren zu erzwingen , bis die Anwendung endet : open -W /path/to/application.app. Beachten Sie, dass, wenn die Anwendung bereits ausgeführt wurde, diese wartet, bis auch die vorhandene Ausführung beendet wird.

Wie groß das Problem ist, hängt davon ab, welche Anwendung Sie ausführen. Wenn es nicht gut funktioniert, ist es möglicherweise nicht die beste Option, dies über die Shell zu tun. In diesem Fall ist es wahrscheinlich besser, mit AppleScript zu arbeiten, nach dem Sie auf Ask Different fragen können .

Michael Homer
quelle
Ich habe eine App auf dem Mac, die absichtlich abstürzen kann und mit der ich Ihre obige Lösung getestet habe. Die App wird auch nach einem Absturz automatisch neu gestartet. Gibt es eine Möglichkeit, den Exit der Anwendung zu überprüfen? as open wird offensichtlich mit einem Exit von 0 beendet und wird trotzdem erneut ausgeführt.
Ben Crazed Up Euden
@ BenCrazedUpEuden: Meines Wissens nach wird opennur bei bestimmten Startfehlern ein Fehler zurückgegeben. Anwendungen werden von einem Systemdienst gestartet, nicht direkt, sodass kein direkter Kommunikationskanal zurück ist. Manchmal ist es möglich, die ausführbare Anwendungsdatei direkt zu starten : /Applications/YourProgram.app/Contents/MacOS/YourProgram. Andernfalls verlassen wir Unix und gehen an Orte, an denen Sie auf Ask Different eine bessere Antwort erhalten . Sie können AppleScript von der Shell mitosascript
Michael Homer
0

Ich habe das getestet:

#!/bin/bash
while <your_cmd_here>
do
    true
done

Dies funktioniert durch Testen des Rückkehrcodes Ihres Befehls im POSIX-Stil. 0 bedeutet Ok, alles andere kann als Fehler behandelt werden.

fduff
quelle