Esegui un comando senza farmi aspettare


145

Nell'interfaccia della riga di comando, a volte un comando che digito richiede un po 'di tempo per completarsi, a volte so quando sta per accadere. Sono un po 'confuso su "backgrounding" e simili in Linux.

Qual è il modo più comune (o intuitivo) di dire alla CLI che non voglio aspettare, per favore restituiscimi immediatamente il mio messaggio. E se potesse darmi una barra di avanzamento o solo una trottola, sarebbe fantastico!


3
Vedi anche Come si inviano le app della riga di comando direttamente in background? se hai già avviato il comando e desideri inviarlo in background.
Gilles,

Risposte:


153

Prima di eseguire il comando, è possibile aggiungere &alla riga di comando per l'esecuzione in background:

long-running-command &

Dopo aver avviato un comando, è possibile premere CtrlZper sospenderlo e quindi bgper inserirlo in background:

long-running-command
[Ctrl+Z]
bg

Ho usato il comando "find ~ / a.java &" ma non sono andato in background? Inoltre, ho provato cmd + z (per mac) .... non funziona
Abhimanyu Aryan il

1
@AbhimanyuAryan, forse prima vuoi eseguire il debug del tuo find ...comando, quindi eseguirlo in background. In questo caso ti mancava l' -nameopzione.
Alexis Wilke,

113

Questo è il preferito di tutti poiché, a parte l'invio del processo in background, non devi preoccuparti che l'output del testo sporchi il tuo terminale:

nohup command &

Questo non solo esegue il processo in background, genera anche un registro (chiamato nohup.outnella directory corrente, se ciò non è possibile, la tua directory home) e se chiudi / disconnetti la shell corrente il processo non viene ucciso impedendo al processo figlio di ricevere il genitore segnala quando viene ucciso (es. disconnettersi da SIGHUP al genitore o chiudere la shell corrente).

C'è un altro chiamato disownma che è piuttosto un'estensione di altre risposte piuttosto che un metodo in sé:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Questi comandi non consentono di ripristinare facilmente gli output del processo a meno che non si utilizzi un modo hacker per farlo.


4
Amministratore di sistema dal '95. Mai sentito parlare di rinnegamento fino ad oggi, grazie! Tuttavia non funziona con tutte le shell (check bash, zsh, tcsh. Tcsh non ha funzionato).
Yoonix,

L'uso nohupin una shell di controllo del lavoro è sciocco. Le shell moderne non vengono inviate HUPai processi in background. Il reindirizzamento a un nome file univoco è un piccolo prezzo da pagare.
pulcini,

@chicks il caso d'uso qui è per evitare che stderr e stdout inquinino il terminale con il vantaggio che crea automaticamente un file di registro.
Braiam,

1
command > file.log 2>&1 & disownè un po 'più lungo di nohup command &ma suppongo sia quello che suggeriva @chicks.
joeytwiddle,

32

Questo è probabilmente quello che vuoi

my_command > output.log 2>&1 &

questo avvierà il tuo comando, reindirizzando sia stdout che stderr ad alcuni output.logche puoi specificare. Se non ti interessa conservare l'output, puoi utilizzare /dev/nullinvece di un file reale.

&eseguirà il comando in background in modo da poter continuare a immettere comandi mentre è in esecuzione. 2>&1reindirizza stderr a stdout in modo che venga catturato tutto l'output.

inoltre, quando esegui un comando come questo, dovresti ottenere una conferma dal kernel simile a questa: [2] 1234 Ciò significa che il tuo processo è in esecuzione in background e il suo ID è 1234, quindi puoi ucciderlo in seguito se lo desideri conkill -9 1234


2
grazie, 2>&1è molto importante perché il comando può fallire e provarlo in alcuni casi genera l'errore!
ericn,

1
Questo ha funzionato quando le risposte sopra non hanno ringraziato.
Domagoj,

9

Guarda sullo schermo o su tmux . Un esempio con tmux:

$ tmux new -d 'longrunningcommand'

Mentre le altre risposte usando '&' per lo sfondo funzioneranno, devi reindirizzare stdout (e stderr!). Senza farlo, l'output andrà direttamente alla tua shell, mescolandosi con qualsiasi altro output tu possa avere.

Lo sfondo non riuscirà anche se si esegue un comando lungo e si disconnette o si disconnette. Il sistema ucciderà il tuo lavoro.

Se non hai familiarità con lo schermo o il tmux, in pratica ti consentono di staccarti completamente dalla tua shell. Invece di mettere in background il tuo programma, fai da sfondo all'intera shell. È quindi possibile tornare ad esso in un secondo momento, anche da un altro computer. Entrambi hanno molte più funzioni che potresti trovare utili o meno oltre a questo caso d'uso.

Lo schermo è il vecchio programma provato e vero; tmux è molto più giovane ma ha imparato dal passato dello schermo.


Questa risposta manca una risposta effettiva e suona come un RTFM.
Lloeki,

5

(Per completezza - già risposto :) Metti un comando in background aggiungendo &dopo il comando:

long_command with arguments > redirection &

Sto aggiungendo questa risposta per affrontare l'altra parte della tua domanda:

Non c'è un vero equivalente dello spinner per mostrare i comandi in background in corso, ma puoi vedere lo stato dei comandi in background digitando jobso jobs -l. Ti mostrerà i tuoi comandi in background e se sono in esecuzione, arrestati tramite segnale (ad esempio, con ^Z) o occasionalmente arrestati perché sono in attesa di input interattivi da parte tua.


long_command with arguments &> redirection &per reindirizzare stderrtroppo
Ice-Blaze,

3

È possibile eseguire un programma in background utilizzando &. Ad esempio, se si desidera eseguire yum install XyZad esempio, è possibile eseguire:

yum install XyZ &

L' stdoutoutput o dal programma può essere reindirizzato utilizzando >per sovrascrivere un file o >>per accodarlo a un file. Ad esempio, se si desidera accedere yuma un file yum.log:

yum install XyZ > yum.log &

Oppure, se si desidera aggiungere l'output a un file esistente log:

yum install XyZ >> log &

Gli errori vengono stampati stderre non stdout, e possono essere reindirizzati a un file nello stesso modo, ma utilizzando 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Se si desidera reindirizzare entrambi stderre stdout, è possibile utilizzare &>:

yum install XyZ &> output
yum install XyZ &>> output

2

È possibile eseguire un comando in background semplicemente inserendo il &segno dopo di esso.

Per esempio:

areallylong_command &

lo eseguirà in background.

Puoi reindirizzare ulteriormente lo stdout / stderr ai file appropriati in modo che non vengano visualizzati sul tuo terminale mentre stai facendo qualcosa.

Vedi questo per maggiori informazioni: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


0

Prova a utilizzare il comando 'screen' prima di iniziare l'attività di lunga durata, quindi quando ti stacchi puoi ricollegarti con 'screen -r -d' ogni volta che devi di nuovo. Trovo che quando si utilizza un terminale su ssh o altre connessioni di rete a volte possono essere interrotti da una cattiva connessione al server. eseguendolo all'interno di uno 'schermo' si risolve questo problema.

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.