Uruchom ponownie skrypt aplikacji, gdy ulegnie awarii?

18

Mam kilka aplikacji, które muszą cały czas działać na moim laptopie.

Używam skryptu bash do uruchamiania tych aplikacji. W moim skrypcie mam pętlę, która wygląda podobnie do tego:

while true;
do
    xterm
done

Spowoduje to uruchomienie aplikacji ( xtermw tym przypadku), a jeśli aplikacja ulegnie awarii, pętla uruchomi ją ponownie.

Ma to tę wadę, że nie ma „czystego” wyjścia z tej pętli. Więc nawet jeśli intencją użytkownika jest zamknięcie xterm, pętla uruchamia ją ponownie.

Czy istnieje sposób, aby uruchomić aplikację ze skryptu bash, sprawdzić, czy jest uruchomiona, uruchomićponownie , jeśli skrypt się zawiesi, lub nic nie robić, jeśli użytkownik poprawnie go zamknął?

Dictador
źródło

Odpowiedzi:

30

Spróbuj tego:

while true; do xterm && break; done

Aplikacje mają kody zakończenia wyjścia, więc jeśli coś wyjdzie dobrze, zwróci zero ... A jeśli coś pójdzie nie tak, wyrzuci inną liczbę. Dzięki temu ludzie mogą się przyłączyć i znaleźć dokładny problem. To właśnie robi druga odpowiedź.

&&sprawdza tylko, czy poprzednie polecenie było wyjściem o zerowym statusie, a jeśli tak, przerywa pętlę. Jeśli się zawiesi, wyrzuci coś innego niż 0, a && ...klauzula się nie uruchomi; po prostu zapętli się i uruchomi xterm.

Cyrus
źródło
6
To całkiem eleganckie.
Oli
Hmm .. while xterm; do true; done
Odwrotnie
1
@muru: To działa dla mnie:while ! xterm; do :; done
Cyrus,
1
@ Cyrus Ah, tak. zapomniałem !.
muru
Stworzyłem potwora. Jak to zabić?
Tony Ruth,
6

W tym whileprzypadku możesz sprawdzić, czy status wyjścia xtermbył udany, czy nie, używając czegoś takiego:

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

$? zmienna przechowuje status wyjścia ostatnio wykonanej komendy.

Leonid V. Fedorenchik
źródło
0

Zasugeruję ci użyć.

do xterm; czy echo „program zakończył się ze statusem $?” ; gotowy

Spowoduje to ponowne uruchomienie programu, jeśli zostanie zabity.

Aravind Ekan
źródło
0

Spróbuj użyć superwizora, to bardzo proste i łatwe do dodania programu lub skryptu do uruchomienia . W twoim przypadku potrzebujesz minimum, commanda może exitcodesw sekcji programx do skonfigurowania.

Domyślnie exitcodesjest to 0,2, co oznacza:

superwizor zrestartuje proces, jeśli zakończy działanie z kodem wyjścia, który nie jest zdefiniowany na tej liście

Zasadniczo to jest to, czego chcesz: uruchom go ponownie , jeśli skrypt się zawiesił, lub nie rób nic, jeśli użytkownik poprawnie go zamknął (lub skrypt zakończył się pomyślnie)

najpierw wypróbuj najprostszą konfigurację:

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

Aby uzyskać większą elastyczność, zapoznaj się z dokumentacją pliku konfiguracji .

Максим Шатов
źródło