Anwendungsskript erneut ausführen, wenn es abstürzt?

18

Ich habe einige Anwendungen, die ständig auf meinem Laptop ausgeführt werden müssen.

Ich benutze ein Bash-Skript, um diese Anwendungen zu starten. In meinem Skript habe ich eine Schleife, die ungefähr so ​​aussieht:

while true;
do
    xterm
done

Dadurch wird ( xtermin diesem Fall) eine Anwendung ausgeführt. Wenn die Anwendung abstürzt, wird sie von der Schleife erneut gestartet.

Dies hat den Nachteil, dass diese Schleife nicht "sauber" verlassen wird. Selbst wenn der Benutzer die Absicht hat, sich zu schließen xterm, startet die Schleife sie erneut.

Gibt es eine Möglichkeit , eine Anwendung über ein Bash-Skript zu starten , zu überwachen, ob sie ausgeführt wird, sie erneut auszuführen , wenn das Skript abgestürzt ist, oder nichts zu tun, wenn der Benutzer sie ordnungsgemäß geschlossen hat?

Diktator
quelle

Antworten:

30

Versuche dies:

while true; do xterm && break; done

Anwendungen haben Exit-Statuscodes, sodass bei einem erfolgreichen Exit Null zurückgegeben wird. Und wenn ein Fehler aufgetreten ist, wird eine andere Zahl ausgegeben. Auf diese Weise können Benutzer das genaue Problem ermitteln. Dies ist, was die andere Antwort tut.

&&Überprüft nur, ob der vorherige Befehl ein Null-Status-Exit war, und unterbricht, falls dies der Fall war, die Schleife. Wenn es abstürzt, wirft es etwas anderes als 0 aus und die && ...Klausel wird nicht ausgelöst. es wird einfach wieder herumlaufen und rennen xterm.

Cyrus
quelle
6
Das ist ziemlich elegant.
Oli
Hmm .. while xterm; do true; done
Umgekehrt
1
@muru: Das funktioniert für mich:while ! xterm; do :; done
Cyrus
1
@ Cyrus Ah, ja. vergaß das !.
Muru
Ich habe ein Monster erschaffen. Wie töte ich es?
Tony Ruth
6

In der whileBedingung können Sie testen, ob der Exit-Status von xtermerfolgreich war oder nicht:

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? Variable enthält den Beendigungsstatus des zuletzt ausgeführten Befehls.

Leonid V. Fedorenchik
quelle
0

Ich schlage vor, Sie zu verwenden.

bis xterm; Echo "Programm mit Status $ beendet?" ; getan

Dadurch wird Ihr Programm erneut ausgeführt, wenn es beendet wird.

Aravind Ekan
quelle
0

Versuchen Sie, Supervisor zu verwenden, es ist sehr einfach und leicht, ein Programm oder ein Skript zum Ausführen hinzuzufügen . In deinem Fall musst du so wenig wie möglich commandund evtl.exitcodes im programx-Bereich konfigurieren.

Der Standardwert exitcodesist 0,2 und bedeutet:

supervisord startet den Prozess neu, wenn er mit einem in dieser Liste nicht definierten Beendigungscode beendet wird

Im Allgemeinen ist es das, was Sie wollen: Führen Sie es erneut aus, wenn das Skript abgestürzt ist, oder tun Sie nichts, wenn der Benutzer es ordnungsgemäß geschlossen hat (oder das Skript erfolgreich abgeschlossen wurde).

Versuchen Sie zuerst die einfachste Konfiguration:

[program:you_app_name]
command=/path/to/you/app

Weitere Informationen zur Flexibilität finden Sie in der Dokumentation zur Konfigurationsdatei .

Максим Шатов
quelle