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. stdout
e stderr
ainda estão anexados ao shell pai.
Se você não quiser ver stdout
e/ou stderr
pode 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 stty
utilitá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 stty
comando:
$ stty tostop
$ echo Hello &
[2] 25873
[2]+ Stopped echo Hello
$
Com tostop
especificado, 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 stty
explica a tostop
opçã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.