2012-02-08 10 views
67

Ho scritto due script di shell a.sh e b.sh. In a.sh eb.sh ho un ciclo infinito e stampano un po 'di output sul terminale. Voglio scrivere un altro script che chiama sia a.sh che b.sh ma voglio che l'utente riprenda immediatamente il controllo del terminale, invece di avere lo script eseguito all'infinito e voglio nascondere l'output nel terminale.Come eseguire uno script di shell in background e non ottenere output

risposta

139

Utilizzare nohup se il lavoro in background richiede molto tempo per terminare o basta utilizzare SecureCRT o qualcosa di simile per accedere al server.

reindirizzare il stdout e stderr a /dev/null ignorare l'uscita.

nohup /path/to/your/script.sh > /dev/null 2>&1 & 
+0

Solo per aggiungere, a volte ci sono argomenti per gli script, quindi il comando sopra restituirà ** Reindirizzamento output ambiguo **. – sabertooth1990

+0

Un modo migliore che ho trovato è quello di utilizzare 'nohup /path/to/your/script.sh parameter1> & 1 &' Se qualcuno conosce un modo migliore. – sabertooth1990

+2

Non è necessario '/ dev/null 2> & 1' se si utilizza' nohup' poiché aggiunge già tutti i flussi STDOUT e STDERR al file nohup.out automaticamente. Utilizzare solo: 'nohup/percorso/a/tuo/comando &' – leonarth

11

Se sono nella stessa directory del script che contiene:

./a.sh > /dev/null 2>&1 & 
./b.sh > /dev/null 2>&1 & 

Il & alla fine è ciò che rende il vostro script eseguito in background.

La parte > /dev/null 2>&1 non è necessaria - reindirizza i flussi stdout e stderr in modo da non doverli vedere sul terminale, cosa che si potrebbe voler fare per gli script rumorosi con un sacco di output.

+0

grazie ogni corpo. tutte le risposte sono state davvero utili, grazie. –

23

reindirizzare l'output in un file in questo modo:

./a.sh > somefile 2>&1 & 

Questa favore sia stdout e stderr allo stesso file. Se si desidera reindirizzare stdout e stderr di due file diversi utilizzare questo:

./a.sh > stdoutfile 2> stderrfile & 

È possibile utilizzare /dev/null come uno o entrambi i file se non vi interessa circa lo stdout e/o stderr.

Vedere bash manpage per dettagli sui reindirizzamenti.

13

Spiacente, questo è un po 'tardi, ma ha trovato la soluzione ideale per i comandi somple in cui non si desidera alcun output standard o di errore (di credito dove è dovuto: http://felixmilea.com/2014/12/running-bash-commands-background-properly/)

Questo reindirizza l'output a null e mantiene schermo chiaro:

command &>/dev/null & 
+0

Nota: il comando verrà terminato quando il terminale è chiuso. – Banana

+0

Chiunque guardi a questo in futuro chi vuole una soluzione per mantenere i comandi in esecuzione al termine di una sessione, suggerirei screen o tmux. È essenziale eseguire una "sessione all'interno di una sessione" che prosegue dopo aver chiuso la sessione iniziale. È quindi possibile riconnettersi alla sessione in corso se ci si collega nuovamente. Ottimo per l'esecuzione di backup rsync, ad esempio dove la sincronizzazione deve essere eseguita per un lungo periodo e non si desidera lasciare la sessione in esecuzione. – DanteAlighieri

Problemi correlati