La creazione di uno script Bash che eseguirà un programma e, se esce senza crash, lo eseguirà di nuovo


8

Mi piacerebbe conoscere il modo più semplice di creare uno script bash che eseguirà un'app in MacOSX (è un sistema basato su UNIX, quindi ho pensato che fosse il posto giusto). attendere che il programma termini. Se l'uscita non è stata un arresto anomalo, eseguirla di nuovo. Altrimenti lascia aperta la finestra del rapporto sugli arresti anomali ed esci.

Vorrei che questo script funzionasse per sempre fino all'arresto anomalo o alla chiusura manuale.

Ho una vaga idea ma non ne sono sicuro. Ecco quello che ho finora:

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

quasi sicuramente non vuoi che uno script venga eseguito per sempre per qualsiasi motivo. vuoi che un servizio - o un demone - sia eseguito per sempre. Non so come lo facciano su Apple, ma probabilmente dovresti guardare un po 'più da vicino il tuo sistema init per scoprire se c'è un modo per registrare un servizio con esso. Di solito i demoni si ripetono periodicamente per aggiornare / salvare lo stato - in realtà non eseguono il loop per sempre.
mikeserv,

Risposte:


12

Questo è ciò che fa Bash mentre i loop fanno:

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

Eseguirà l'applicazione e, se termina correttamente, esegue il corpo del ciclo. :è il comando no-op della shell (il loop deve avere un corpo, quindi è quello che mettiamo lì); dopodiché torna all'inizio ed esegue nuovamente il programma. Se fallisce, il ciclo si interrompe e lo script termina.

Tuttavia, sembra che ciò che stai eseguendo potrebbe essere una normale applicazione Mac ( .app): ci sono un paio di problemi che sorgono in quel caso. Uno è che è necessario utilizzare il opencomando , piuttosto che correre direttamente nella directory dell'applicazione: open /path/to/application.app.

L'altro è che quando lo fai di opensolito termina immediatamente con successo, indipendentemente da ciò che l'applicazione fa: non è assolutamente universale, ma la maggior parte lo farà. Se la si fa, è possibile utilizzare l' -Wopzione di forzare openper bloccare fino al termine di applicazione: open -W /path/to/application.app. Si noti che se l'applicazione era già in esecuzione, questo attenderà fino al termine anche dell'esecuzione esistente.

La quantità di un problema dipende da quale applicazione stai eseguendo. Se non funziona bene, farlo dalla shell potrebbe non essere l'opzione migliore. In tal caso probabilmente starai meglio con AppleScript, di cui puoi chiedere informazioni su Ask Different .


Ho un'app su Mac che può causare l'arresto anomalo intenzionale con cui ho testato la tua soluzione sopra. riavvierà automaticamente l'app anche dopo un arresto anomalo. C'è un modo per controllare l'uscita dell'applicazione? poiché open terminerà ovviamente con un'uscita di 0, quindi verrà eseguito nuovamente indipendentemente.
Ben Crazed Up Euden,

@BenCrazedUpEuden: La mia comprensione è che openrestituisce un errore solo per determinati errori di avvio. Le applicazioni vengono avviate da un servizio di sistema, non direttamente, quindi non è disponibile alcun canale di comunicazione diretto. A volte è possibile avviare direttamente l'eseguibile dell'applicazione: /Applications/YourProgram.app/Contents/MacOS/YourProgram. Altrimenti, stiamo andando alla deriva da Unix e in posti otterrai una risposta migliore su Ask Different . Puoi eseguire AppleScript dalla shell conosascript
Michael Homer,

0

Ho provato questo:

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

Funziona testando il codice di ritorno del tuo comando, stile POSIX. 0 significa Ok, qualsiasi altra cosa può essere trattata come un errore.

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.