Comment exécuter une boucle infinie en arrière-plan

17

Comment puis-je exécuter une boucle infinie en arrière-plan, tout en poursuivant l'exécution du script?

Exemple de "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

Cela (remarquez le &) semble planter l'ensemble du système après un court instant:

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
la source
Pas surpris, vous créez de nombreux processus.
Ed Heal
Demander des directions pour une bombe à fourche?
Baazigar
1
Pourriez-vous s'il vous plaît dire l'intention derrière l'exécution d'une boucle infinie en arrière-plan?
neurone

Réponses:

31

Avec l' &intérieur de la boucle, il démarrera un nouveau processus en arrière-plan et aussi vite qu'il pourra le faire à nouveau sans attendre la fin du premier processus. Au lieu de cela, je pense que vous voulez mettre la boucle en arrière-plan, alors mettez la &sur la boucle elle-même comme

while /bin/true; do
    something_in_the_background
done &

# more stuff
Eric Renouf
la source
10
while : ; do something ; done &
  • Antérieures shells Bourne n'a pas eu trueet falsecomme intégré des commandes. trueétait plutôt simplement aliasé :, et falsequelque chose comme let 0.

  • & à la fin de la ligne, le processus

  • : est la commande null, comme décrit par "help:": No effect; the command does nothing. Exit Status: Always succeeds.
John
la source
2
Votre réponse serait grandement améliorée en l'expliquant - le PO peut ne pas savoir ce que :signifie et ne sait probablement pas pourquoi vous avez déplacé &la fin. De plus, changer l'espacement pour en faire un monoligne est tout simplement déroutant - c'est un changement qui est très visible mais n'a aucune importance.
derobert
Modifié le message selon vos commentaires
John
0

Mettre en veille disons 0,1 ou 0,01 seconde rendrait votre boucle plus conviviale pour le processeur. Mais comme l'a souligné Eric Renouf, le & devrait être à la fin de la boucle, pas à l'intérieur.

daltonfury42
la source