por que os trabalhos em segundo plano dependem do tamanho da saída?

4

Eu tinha alguns scripts de teste de estresse que estavam sendo executados em paralelo e eles travavam depois de terminar e esperavam que um pressionamento de tecla RETURN saísse. Depois de investigar descobri que não é peculiar aos meus scripts, mas a todos os tipos de scripts executados no bash e que depende do tamanho da saída produzida (pelo menos no meu sistema: Ubuntu precisa)

Por exemplo, o seguinte:

find . &

trava e espera por um pressionamento de tecla RETORNAR se uma saída suficiente for produzida (tente .. ou ../ .. para obter mais saída), caso contrário (ou seja, se a saída "pequena" for produzida) sai sem ser pendurada.

Desde que eu acho esse tipo de recurso irritante no meu caso particular, há uma maneira de contornar isso?

    
por Marcus Junius Brutus 12.03.2013 / 11:24

1 resposta

15

O comando não trava. Você acha que o comando está travando porque você não vê o prompt. O prompt está lá. Você não vê o prompt porque ele foi enviado pela saída do processo em segundo plano. Pressionar enter após a saída longa de um processo em segundo plano faz com que o shell "execute" a linha vazia e imprima um novo prompt.

Tente o seguinte para se convencer:

  1. execute find . &
  2. espere até que a saída seja feita
  3. ver o cursor piscando ou algo assim, mas nenhum prompt
  4. digite echo foo
  5. pressione Enter
  6. veja foo impresso e um novo prompt

Mais experiências:

seq 10 &

isto imprimirá os números de 1 a 10 e depois imprimirá uma solicitação.

seq 10000 &

isto imprimirá os números de 1 a 10000 e então você terá o cursor piscando e nenhum prompt. Mas o prompt está lá. tente echo foo e pressione enter e você verá foo impresso e um novo prompt.

(sleep 2; seq 10) &

este comando emula o tempo de espera de um comando com saída longa, mas não possui uma saída longa. No meu sistema, isso tem o seguinte efeito: primeiro sleep 2 é executado em segundo plano. momentos depois, o shell imprime o prompt. depois de 2 segundos, seq 10 é executado em segundo plano. isto irá imprimir dez linhas e empurrar o prompt para cima. então o trabalho em segundo plano está pronto.

Então você vê que o trabalho em segundo plano sempre termina e você sempre tem um prompt, você nem sempre vê o prompt. Quando o trabalho em segundo plano é concluído rapidamente, o shell imprime o prompt no final e você vê o prompt. Quando o trabalho em segundo plano demora um pouco para imprimir, o shell já imprimiu um prompt, mas esse prompt é enviado para que você não o veja mais.

Ainda mais experimentos:

Teste seq 10000 & ou qualquer outro número grande em que não seja exibido um prompt no final da saída. Agora tente metade desse número. Neste exemplo seq 5000 & . Você vê um aviso? Se você fizer isso, tente um número maior. Por exemplo, seq 7500 & . Se você não vir um prompt, tente um número menor. Por exemplo, seq 2500 & . Continue fazendo isso até que você tenha o número onde você vê o prompt empurrado apenas algumas linhas para cima. O número varia de corrida para corrida porque o que temos aqui é praticamente uma condição de corrida entre o processo em segundo plano e o processo shell .

    
por 12.03.2013 / 12:36