¿Por qué puedo ver la salida de los procesos en segundo plano?

31

Por ejemplo, cuando escribo ping 8.8.8.8 &, ¿por qué podemos ver el proceso de ping funcionando? Y cuando escribo find / -name '*test*' &, también se ve en el monitor.

¿Porqué es eso? ¿No está realmente en segundo plano?

Sin Cerca
fuente

Respuestas:

43

La &dirige el shell para ejecutar el comando en el fondo, es decir, que se bifurca y se ejecutan en un sub-shell por separado, como un trabajo, de forma asíncrona.

Tenga en cuenta que cuando coloca &la salida, tanto stdout como stderr , todavía se imprimirán en la pantalla . Si no desea ver ningún resultado en la pantalla, redirija ambos stdouty stderra un archivo:

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

Por lo general, es posible que desees descartarlo stderrredirigiéndolo a /dev/nullsi no te preocupa analizar los errores más adelante.

También puede ejecutar comandos / scripts al mismo tiempo, en subcapas separadas. Por ej.

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

Un trabajo en segundo plano puede volver a la línea de comando antes de que finalice con el comando:

fg <job-number>

El job-numberse puede obtener ejecutando

jobs
Ron
fuente
Buena respuesta. Podría incluir que también se puede usar /dev/nullcomo un archivo para redirigir la salida del terminal si se desea descartar la salida en lugar de guardarla en algún lugar. ¿Y estoy en lo cierto que 2>&1redirige stderra stdout? Quizás también quieras aclarar eso ... Gracias.
Byte Commander
@ByteCommander Gracias :) editado, espero que esté claro ahora. Sí, tienes razón, 2>&1redirige stderra stdout.
Ron
3
Creo que valdría la pena mencionar que stty tostophará que se suspendan los trabajos en segundo plano si intentan escribir en el terminal.
Kasperd
cmd_with_params> / dev / null 2> / dev / null &
tgkprog
El único inconveniente de hacerlo es que el orden de las salidas a stdout y stderr puede mezclarse en el archivo de registro.
Matthieu
8

Cuando lo usa &, el proceso se ejecuta en segundo plano. Pero su salida estándar sigue siendo la terminal.

De hecho, puede ejecutar ping 8.8.8.8 &y find / -name '*test*' &al mismo tiempo (lo que resulta en una salida mixta), pero no puede ejecutar ping 8.8.8.8y find / -name '*test*'al mismo tiempo en el mismo shell.

Si no quieres ver nada, usa algo como ping 8.8.8.8 &> /dev/null &.


Además, es posible que desee aprender sobre nohupy disown.

Andrea Corbellini
fuente
disownno evita que la salida se imprima en el terminal.
Ruslan
@Ruslan: no, pero elimina el trabajo del shell. Lo que puede (o no) ser algo en lo que el OP pueda estar interesado.
Andrea Corbellini