¿Por qué un proceso en segundo plano, iniciado en bash, imprime la salida estándar en la pantalla?

¿Por qué un proceso en segundo plano, iniciado en bash, imprime la salida estándar en la pantalla?

Tengo problemas para entender mi situación y Google no ha sido de mucha ayuda hasta ahora.

Comencé un trabajo en segundo plano de bash:

ping google.com &

Primero obtengo la ID del proceso, luego Bash imprime la salida estándar en la pantalla.

user@host:~$ ping google.com &
[1] 14004
user@host:~$ PING google.com (173.194.44.66) 56(84) bytes of data.
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=1 ttl=54 time=26.3 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=2 ttl=54 time=27.4 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=3 ttl=54 time=29.2 ms
...

Esto contradice todo lo que leí hoy. Tengo una configuración estándar de Debian Jessie que ejecuta GNU bash, versión 4.3.30(1) (x86_64-pc-linux-gnu).

¿Puede alguien explicarme esto? Gracias.

Respuesta1

De forma predeterminada, al menos para sistemas compatibles con POSIX, ejecutar un comando en segundo plano, con &, solo se separa stdin, por lo que podrá ejecutar otros comandos. stdouty stderrtodavía están conectados al shell principal.

Si no desea verlos stdouty/o stderrsimplemente puede redirigirlos a un archivo o /dev/null:

command &>log.txt &                #stdout and stderr to log.txt
command 1>/dev/null &               #stdout to /dev/null, stderr still attached to shell
command 1>output.log 2>error.log &  #stdout to output.log, stderr to error.log

Respuesta2

Depende de usted si se muestra la salida estándar de un proceso en segundo plano en el terminal. Puede cambiar el comportamiento con la sttyutilidad.

Ejemplo

El valor predeterminado permite que un proceso en segundo plano escriba en la terminal:

$ echo Hello &
[1] 25850
Hello
$

Ese comportamiento se puede cambiar con el sttycomando:

$ stty tostop
$ echo Hello &
[2] 25873

[2]+  Stopped                 echo Hello
$ 

Si tostopse especifica, el proceso en segundo plano se detiene cuando intenta escribir en la salida estándar. Si desea permitir que continúe, puede devolverlo al primer plano:

$ fg
echo Hello
Hello
$

Para volver atrás, ejecute stty -tostop. Después de ejecutar esto,nuevoLos trabajos en segundo plano que se creen podrán escribir en la salida estándar. (Los trabajos existentes no se verán afectados).

Documentación

man sttyexplica la tostopopción de la siguiente manera:

* [-]tostop
detener trabajos en segundo plano que intentan escribir en la terminal

*La página de manual utiliza lo anterior para identificar esta opción como no POSIX .

información relacionada