Perché posso vedere l'output dei processi in background?


31

Ad esempio, quando digito ping 8.8.8.8 &, perché possiamo vedere il processo di ping funzionante? E quando scrivo find / -name '*test*' &, si vede anche sul monitor.

Perché? Non è davvero in background?

Risposte:


43

La &indirizza alla shell di eseguire il comando in background, cioè, è biforcuta e operare in un sub-shell separato, come un lavoro, in modo asincrono.

Si noti che quando si inserisce &l'output - sia stdout che stderr - verranno comunque stampati sullo schermo . Se non si desidera visualizzare alcun output sullo schermo, reindirizzare entrambi stdoute stderrsu un file:

myscript > ~/myscript.log 2>&1 &

Di solito potresti voler scartare stderrreindirizzandolo a /dev/nullse non sei preoccupato di analizzare gli errori in seguito.

Puoi anche eseguire comandi / script contemporaneamente, in sotto-shell separate. Per esempio;

./script1 & ./script2 & ./script3 & 

Un lavoro in background può essere riportato alla riga di comando prima che termini con il comando:

fg <job-number>

È job-numberpossibile ottenere eseguendo

jobs

Buona risposta. Si potrebbe includere che si può anche usare /dev/nullcome file per reindirizzare l'output del terminale se si vuole scartare l'output invece di salvarlo da qualche parte. E ho ragione che i 2>&1reindirizzamenti stderra stdout? Forse vuoi chiarire anche quello ... Grazie.
Byte Commander

@ByteCommander Grazie :) modificato, spero sia chiaro adesso. Sì, hai ragione, 2>&1reindirizza stderra stdout.
Ron,

3
Penso che varrebbe la pena ricordare che stty tostopprovocherà la sospensione dei lavori in background se provano a scrivere sul terminale.
Kasperd,

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

L'unico aspetto negativo di ciò è che l'ordine degli output su stdout e stderr può essere confuso nel file di registro.
Matthieu,

8

Quando si utilizza &, il processo è in esecuzione in background. Ma il suo output standard è ancora il terminale.

In effetti, è possibile eseguire ping 8.8.8.8 &e find / -name '*test*' &allo stesso tempo (con conseguente output misto), ma non è possibile eseguire ping 8.8.8.8e find / -name '*test*'allo stesso tempo sulla stessa shell.

Se non vuoi vedere nulla, usa qualcosa di simile ping 8.8.8.8 &> /dev/null &.


Inoltre, potresti voler conoscere nohupe disown.


disownnon impedisce la stampa dell'output sul terminale.
Ruslan,

@Ruslan: no, ma rimuove il lavoro dalla shell. Che può (o non può essere) essere qualcosa a cui l'OP potrebbe essere interessato.
Andrea Corbellini,
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.