Esegui lo script Bash in background e termina il terminale


Risposte:


45

Per evitare la propagazione dei segnali di uscita ai processi figlio del terminale e della shell, eseguire il comando con nohup, ad esempio:

nohup cmd &

1
Questa è la risposta corretta Senza nohup, il processo avviato è ancora considerato un "figlio" del processo terminale e quindi terminato se il terminale è chiuso.
Izzy,

3
cmd & disownfunziona anche, poiché &viene trattato come un ;separatore di comandi. Il comando disown rimuove la connessione tra la sessione della shell bash e il comando in background.
lornix,

2
zsh ha una scorciatoia per questo: cmd &|.
Thor,

Perché questo funzioni, ho dovuto cambiare una preferenza in Terminal.app. In Profili, seleziona il tuo profilo attivo, quindi Shell> Quando la shell esce> Chiudi se la shell è uscita in modo pulito
antoine

6

Utilizzando screen:

screen -S <session name> -d -m <your command>

dopodiché puoi uscire dal terminale, inoltre puoi ricollegarlo ad esso:

screen -r <session name>

Maggiori informazioni: riferimento


4

Se si desidera eseguire un comando o un file specifico ogni secondo circa in background dopo essere usciti dal terminale, è possibile provare questa semplice piccola cosa;

nohup watch -n5 'bash script.sh' &

Sarebbe eseguito scipt.sh ogni 5 secondi.


1
"nohup" è già coperto dalla risposta accettata. E sono abbastanza sicuro che il richiedente abbia menzionato cron perché lo stavano usando per dire "Esegui questo comando qualche secondo in futuro", non per eseguirlo periodicamente.
David Richerby,

1
La mia risposta non peggiora le cose. Vedi il punto di voto negativo. Neural sarebbe sufficiente.
jamietelin,

3

Inserisci un carattere "&" dopo il tuo comando.

per esempio:

/home/your/script.sh &

7
in questo caso, quando il terminale è chiuso, anche il processo viene avviato da /home/your/script.sh- in quanto non è stato staccato dal suo "genitore", ma solo "in background". Usa nohupper staccarlo per davvero.
Izzy,

Mio male, non lo sapevo, ma quando ho provato su Debian, il comando ha continuato a essere eseguito dopo aver chiuso la shell che lo ha lanciato: /
Flinth

1
Non sono sicuro di dove sia esattamente collegato il processo in background e quando. Ma se ad esempio si accede a un computer remoto, viene definitivamente interrotto non appena si esegue il logout (tranne se si è demonizzato da solo). Quindi, per essere sicuri al 100%, preferisci usare nohup- che registra anche tutto l'output (ora invisibile) in un file chiamato nohup.outsituato nella directory da cui hai avviato il comando.
Izzy,

Bene, grazie per le tue spiegazioni ^^
Flinth

Questa risposta potrebbe funzionare bene se combinata con il jobscomando. Molto spesso voglio essere in grado di tornare al processo della shell dopo averlo messo in background.
Djangofan,
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.