Por que posso ver a saída dos processos em segundo plano?


31

Por exemplo, quando eu digito ping 8.8.8.8 &, por que podemos ver o processo de ping funcionando? E quando eu digito find / -name '*test*' &, também é visto no monitor.

Por que é que? Não é realmente em segundo plano?

Respostas:


43

O &comando direciona o shell para executar o comando em segundo plano, ou seja, ele é bifurcado e executado em um sub-shell separado, como um trabalho, de forma assíncrona.

Observe que quando você coloca &a saída - stdout e stderr - ainda será impressa na tela . Se você não deseja ver nenhuma saída na tela, redirecione ambos stdoute stderrpara um arquivo:

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

Geralmente, você pode descartar o stderrredirecionando para /dev/nullse não estiver preocupado com a análise de erros posteriormente.

Você também pode executar comandos / scripts ao mesmo tempo, em subcascas separadas. Por exemplo;

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

Um trabalho em segundo plano pode ser trazido de volta para a linha de comandos antes de terminar com o comando:

fg <job-number>

O job-numberpode ser obtido executando

jobs

Boa resposta. Você pode incluir que um também pode ser usado /dev/nullcomo um arquivo para redirecionar a saída do terminal se desejar descartar a saída em vez de salvá-la em algum lugar. E estou certo que 2>&1redireciona stderrpara stdout? Talvez você queira esclarecer isso também ... Obrigado.
Byte Commander

@ByteCommander Obrigado :) editado, espero que esteja claro agora. Sim, você está certo, 2>&1redireciona stderrpara stdout.
Ron

3
Eu acho que vale a pena mencionar que stty tostopfará com que os trabalhos em segundo plano sejam suspensos se eles tentarem gravar no terminal.
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

A única desvantagem disso é que a ordem das saídas para stdout e stderr pode se confundir no arquivo de log.
matthieu

8

Quando você usa &, o processo está sendo executado em segundo plano. Mas sua saída padrão ainda é o terminal.

De fato, você pode executar ping 8.8.8.8 &e find / -name '*test*' &ao mesmo tempo (resultando em uma saída mista), mas não pode executar ping 8.8.8.8e find / -name '*test*'ao mesmo tempo no mesmo shell.

Se você não quiser ver nada, use algo como ping 8.8.8.8 &> /dev/null &.


Além disso, você pode querer aprender sobre nohupe disown.


disownnão impede que a saída seja impressa no terminal.
Ruslan

@Ruslan: não, mas remove o trabalho do shell. O que pode (ou não) ser algo em que o OP possa estar interessado.
Andrea Corbellini
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.