Come eseguire un comando in background e non ottenere alcun output?


111

Ho scritto due script di shell a.she b.sh. In a.she b.shho un ciclo for infinito e stampano alcuni output sul terminale. Voglio scrivere un altro script che chiama entrambi a.she b.shma 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.

Risposte:


220

Uso nohup se il tuo lavoro in background richiede molto tempo per finire o usi semplicemente SecureCRT o qualcosa di simile accedi al server.

Reindirizza lo stdout e lo stderr a /dev/nullper ignorare l'output.

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

Solo per aggiungere, a volte ci sono argomenti per gli script, quindi il comando sopra restituirà il reindirizzamento dell'output ambiguo .
sabertooth1990

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

18
Non è necessario /dev/null 2>&1se lo stai utilizzando nohuppoiché aggiunge già automaticamente tutti i flussi STDOUT e STDERR al file nohup.out. Usa solo:nohup /path/to/your/command &
Leonardo

1
@ sabertooth1990 La tua riga di comando è difettosa:-bash: syntax error near unexpected token '&'
notes-jj

1
Come interrompereste quindi il processo creato?
Alexis_A

33

Reindirizza l'output a un file come questo:

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

Questo reindirizzerà sia stdout che stderr allo stesso file. Se vuoi reindirizzare stdout e stderr su due file diversi usa questo:

./a.sh > stdoutfile 2> stderrfile &

Puoi usare /dev/nullcome uno o entrambi i file se non ti interessa lo stdout e / o lo stderr.

Vedere la manpage bash per i dettagli sui reindirizzamenti.


23

Spiacente, è un po 'in ritardo ma ho trovato la soluzione ideale per comandi semplici in cui non vuoi alcun output standard o di errore (credito dove è dovuto: http://felixmilea.com/2014/12/running-bash-commands-background -properly / )

Questo reindirizza l'output a null e mantiene lo schermo pulito:

command &>/dev/null &

2
Nota: il comando verrà terminato alla chiusura del terminale.
Banana

1
Per chiunque lo guardi in futuro e desideri una soluzione per mantenere i comandi in esecuzione al termine di una sessione, suggerirei screen o tmux. Essenzialmente eseguono una "sessione all'interno di una sessione" che prosegue dopo la chiusura della sessione iniziale. È quindi possibile riconnettersi alla sessione in corso se si effettua nuovamente l'accesso. Ottimo per eseguire backup rsync, ad esempio quando la sincronizzazione deve essere eseguita per un lungo periodo e non si desidera lasciare la sessione in esecuzione.
DanteAlighieri

13

Se si trovano nella stessa directory del tuo script che contiene:

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

Alla &fine è ciò che fa eseguire il tuo script in background.

La > /dev/null 2>&1parte non è necessaria: reindirizza i flussi stdout e stderr in modo da non doverli vedere sul terminale, cosa che potresti voler fare per script rumorosi con molto output.


7

Esegui in una subshell per rimuovere le notifiche e chiudere STDOUT e STDERR:

(&>/dev/null script.sh &)

Questa è l'unica risposta che inoltre non stampa i registri dei lavori in background come [1] + 54765 done <emacs>ringraziamento
alper

2

Se vuoi eseguire lo script in un kickstart Linux devi eseguire come di seguito.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &


0

Questi esempi funzionano bene:

nohup sh prog.sh proglog.log 2> & 1 &

Per loop puoi usare in questo modo:

per i in {1..10}; do sh prog.sh; dormire 1; done prog. log 2> & 1 &

Funziona in background e non mostra alcun output.

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.