¿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?

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.