Rieseguire uno script dell'applicazione in caso di arresto anomalo?


18

Ho alcune applicazioni che devono funzionare sempre sul mio laptop.

Uso uno script bash per avviare queste applicazioni. Nel mio script ho un loop simile a questo:

while true;
do
    xterm
done

Ciò esegue un'applicazione ( xtermin questo caso) e se l'applicazione si arresta in modo anomalo, il ciclo la riavvia.

Questo ha uno svantaggio che non esiste un'uscita "pulita" da questo loop. Quindi, anche se l'intenzione dell'utente è quella di chiudere xterm, il loop lo riavvia.

C'è un modo per avviare un'applicazione dallo script bash, vedere se è in esecuzione, per eseguirla nuovamente in caso di arresto anomalo dello script o non fare nulla se l'utente l'ha chiusa correttamente?

Risposte:


30

Prova questo:

while true; do xterm && break; done

Le applicazioni hanno codici di stato di uscita in modo che se qualcosa esce bene restituisce zero ... E se qualcosa è andato storto, ne getta un altro numero. Ciò consente alle persone di collegarsi e scoprire il problema esatto. Questo è ciò che sta facendo l'altra risposta.

&&verifica solo che il comando precedente fosse un'uscita a stato zero e, in caso affermativo, interrompe il ciclo. Se si arresta in modo anomalo, && ...genererà qualcosa di diverso da 0 e la clausola non si innescherà; semplicemente tornerà indietro e scapperà xterm.


6
È abbastanza elegante.
Oli

Mmm .. Anche il contrario:while xterm; do true; done
muru,

1
@muru: Questo funziona per me:while ! xterm; do :; done
Cyrus,

1
@Cyrus Ah, sì. dimenticato il !.
Muru,

Ho creato un mostro. Come lo uccido?
Tony Ruth,

6

Nella whilecondizione è possibile verificare se lo stato di uscita ha xtermavuto esito positivo o meno con qualcosa del genere:

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

$? la variabile mantiene lo stato di uscita dell'ultimo comando eseguito.


0

Ti suggerirò di usare.

fino a xterm; echo "il programma è terminato con lo stato $?" ; fatto

Questo eseguirà nuovamente il programma se viene ucciso.


0

Prova a usare il supervisore è molto semplice e facile aggiungere programma o script da eseguire . Nel tuo caso il minimo è necessario commande forse exitcodesnella sezione programx per configurare.

L'impostazione predefinita exitcodesè 0,2, quindi significa:

supervisord riavvierà il processo se esce con un codice di uscita non definito in questo elenco

In generale è quello che vuoi: eseguirlo nuovamente se lo script si è bloccato o non fare nulla se l'utente lo ha chiuso correttamente (o lo script è stato completato correttamente)

prova prima la configurazione più semplice:

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

Per una maggiore flessibilità, consultare la documentazione del file di configurazione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.