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
user12a
fonte
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
Eric Renouf
fonte
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.
John
fonte
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.

daltonfury42
fonte