Por que um processo em segundo plano, iniciado no bash, imprime stdout na tela?

Por que um processo em segundo plano, iniciado no bash, imprime stdout na tela?

Tenho dificuldade em entender minha situação e o Google não foi muito útil até agora.

Comecei um trabalho em segundo plano do bash:

ping google.com &

Primeiro eu obtenho o ID do processo, depois o Bash imprime o stdout na tela.

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
...

Isso contradiz tudo que li hoje. Eu tenho uma configuração padrão do Debian Jessie executando GNU bash, versão 4.3.30(1)-release (x86_64-pc-linux-gnu).

Alguém pode me explicar isso? Obrigado.

Responder1

Por padrão, pelo menos para sistemas compatíveis com POSIX, executar um comando em segundo plano, com &, apenas detaches stdin, para que você possa executar outros comandos. stdoute stderrainda estão anexados ao shell pai.

Se você não quiser ver stdoute/ou stderrpode simplesmente redirecioná-los para um arquivo ou /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

Responder2

Depende de você se o stdout de um processo em segundo plano é mostrado no terminal. Você pode alterar o comportamento com o sttyutilitário.

Exemplo

O padrão permite que um processo em segundo plano grave no terminal:

$ echo Hello &
[1] 25850
Hello
$

Esse comportamento pode ser alterado com o sttycomando:

$ stty tostop
$ echo Hello &
[2] 25873

[2]+  Stopped                 echo Hello
$ 

Com tostopespecificado, o processo em segundo plano é interrompido quando tenta gravar no stdout. Se quiser permitir que continue, você pode trazê-lo de volta para o primeiro plano:

$ fg
echo Hello
Hello
$

Para voltar, execute stty -tostop. Depois que isso for executado,novoos trabalhos em segundo plano criados terão permissão para gravar no stdout. (Os empregos existentes não serão afetados.)

Documentação

man sttyexplica a tostopopção da seguinte forma:

* [-]para parar
trabalhos em segundo plano que tentam gravar no terminal

O cabeçalho *acima é usado pela página de manual para identificar esta opção como não POSIX.

informação relacionada