Como executar um loop infinito em segundo plano


17

Como posso executar um loop infinito em segundo plano, continuando com a execução do script?

Exemplo "script":

while true; do something_in_the_background; done

do_something_while_the_loop_goes_on_in_the_background

for 1 2 3; do somethingelse; done

exit 0

Isso (observe o &) parece travar todo o sistema após um curto período de tempo:

while true; do
  something_in_the_background &
done

do_something_while_the_loop_goes_on_in_the_background

for 1 2 3; do somethingelse; done

exit 0

Não é surpresa que você esteja criando muitos processos.
Ed curar

Pedindo instruções para uma bomba de garfo?
precisa saber é o seguinte

1
Você poderia dizer a intenção por trás de executar um loop infinito em segundo plano?
Neuron

Respostas:


31

Com o &interior do loop, ele inicia um novo processo em segundo plano e o mais rápido possível, sem esperar pelo término do primeiro processo. Em vez disso, acho que você deseja colocar o loop em segundo plano, então coloque o &próprio loop como

while /bin/true; do
    something_in_the_background
done &

# more stuff

10
while : ; do something ; done &
  • Os projéteis Bourne anteriores não tinham truee falsecomo comandos embutidos. trueera simplesmente um alias para :, e falsepara algo parecido let 0.

  • & no final da linha, o processo é processado

  • : é o comando nulo, conforme descrito por "help:": No effect; the command does nothing. Exit Status: Always succeeds.

2
Sua resposta seria melhorada explicando-o - o OP pode não saber o que :significa e provavelmente não sabe por que você mudou o caminho &para o fim. Além disso, alterar o espaçamento para torná-lo uma linha única é apenas confuso - é uma alteração que é muito visível, mas não tem importância.
derobert

Editou a publicação de acordo com suas opiniões
John

0

Colocar o sono de, digamos, 0,1 ou 0,01 segundos, tornaria seu loop mais amigável à CPU. Mas, como apontado por Eric Renouf, o & deve estar no final do loop, não dentro dele.

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.