Come eseguire un ciclo infinito in background


17

Come posso eseguire un ciclo infinito in background, continuando con l'esecuzione dello script?

Esempio "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

Questo (notate il &) sembra mandare in crash l'intero sistema dopo poco:

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

Non sorpreso, stai creando molti processi.
Ed Heal,

Chiedere indicazioni per una bomba a forcella?
Baazigar,

1
Potresti dire l'intenzione dietro l'esecuzione di un loop infinito in background?
neurone,

Risposte:


31

Con l' &interno del ciclo inizierà un nuovo processo in background e il più velocemente possibile per farlo di nuovo senza attendere la fine del primo processo. Invece penso che tu voglia mettere il loop in background, quindi metti &il loop stesso come

while /bin/true; do
    something_in_the_background
done &

# more stuff

10
while : ; do something ; done &
  • Le shell Bourne precedenti non avevano truee falsecome comandi integrati. trueera invece semplicemente aliasato :e falsequalcosa del genere let 0.

  • & alla fine della riga viene avviato il processo

  • : è il comando null, come descritto da "help:": No effect; the command does nothing. Exit Status: Always succeeds.

2
La tua risposta sarebbe notevolmente migliorata spiegandola: l'OP potrebbe non sapere cosa :significhi e probabilmente non sa perché l'hai spostato &fino alla fine. Inoltre, cambiare la spaziatura per renderla una fodera è solo fonte di confusione: è un cambiamento che è molto visibile ma non è assolutamente importante.
derobert,

Modificato il post secondo le tue recensioni
John

0

Mettere sleep di dire .1 o .01 secondi renderebbe il tuo loop più amichevole per la CPU. Ma come sottolineato da Eric Renouf, il e dovrebbe essere alla fine del ciclo, non al suo interno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.