Por que os processos em segundo plano às vezes param espontaneamente?

10

Às vezes, algum tempo depois de ter passado um processo bgem segundo plano no bash, quando pressiono Enter no mesmo shell para exibir novamente o prompt (apenas para verificar se ainda estou no bash quando alguma saída do processo em segundo plano foi exibida), o processo em segundo plano parece parar espontaneamente.

Se eu fizer bgnovamente, o mesmo problema se repete.

A única maneira de corrigi-lo parece ser fg.

Por que isso acontece?

Robin Green
fonte
Para onde está indo sua saída? Você está preenchendo um buffer em algum lugar?
Paul Tomblin

Respostas:

12

Isso geralmente acontece se o processo tentar ler seu stdinfluxo. Quando o processo está em segundo plano, ele recebe um sinal TTIN e, portanto, é congelado (o mesmo comportamento de um sinal STOP). Há também o sinal duplo TTOU quando um processo em segundo plano tenta gravar em seu terminal.

Trazê-lo para o primeiro plano retoma o processo e permite a leitura no seu terminal.

Demo:

$ cat t.sh
#! /bin/sh
sleep 1
read dummy
$ ./t.sh &
[1] 3364
$ 
[1]+  Stopped                 ./t.sh
$ ps aux|grep t.sh
me  3364  0.0  0.0  11268  1200 pts/0    T    17:04   0:00 /bin/sh ./t.sh

Uma das maneiras de evitar isso é usar nohup, mas isso pode ter efeitos estranhos se o programa não lidar com o redirecionamento do fluxo de entrada /dev/null.

Esteira
fonte