Shell skript čeká na příkaz na pozadí

Píšu skript, ale potřebuji něco, co nemohu „najít způsob, jak to udělat …

Musím udělat příkaz na pozadí „command1 &“ a pak někde ve skriptu musím počkat, až to skončí, než udělám command2. V podstatě , Potřebuji toto:

POZNÁMKA: každý příkaz běží v určitém adresáři! Na konci smyčky while můj příkaz1 vytvořil 4 adresáře, kde v každém z nich spusťte konkrétní proces, takže celkový proces běží 4

 a=1 while [$a -lt 4 ] . command1 #Generates 1 Process a= `export $a +1` done #Wait until the 4 process end and then run the command2 . command2  

Viděl jsem něco o wait příkaz s číslem procesu pid, ale také to nefungovalo.

Komentáře

  • Ovládáte command1? Můžete jej upravit tak, aby vracel PID 4 procesů?
  • Ano! Už to mám 🙂
  • Podle toho jsem aktualizoval svoji odpověď. Řekněte mi, zda odpovídá vašim očekáváním.
  • Toto Q souvisí s tímto: unix.stackexchange.com/questions/100801/… . Jediným rozdílem je, že musíte získat PID z procesu na pozadí. Chcete-li to získat, můžete použít proměnnou $! a předat ji příkazu wait, jak jsem tam ukázal. $! obsahuje poslední PID na pozadí, zatímco $$ obsahuje poslední běh procesu ' s PID .
  • Dobře, váš skript teď nemá vůbec žádný smysl. Všude kolem jsou syntaktické chyby a podivnost. Můžete nám ukázat skutečný skript? Proč získáváte příkazy? Proč je prostě neprovést?

Odpovědět

Můžete použít příkaz wait PID čekat na ukončení procesu.

Můžete také získat PID posledního příkazu pomocí $!

v ve vašem případě by něco takového fungovalo:

command1 & #run command1 in background PID=$! #catch the last PID, here from command1 command2 #run command2 while command1 is running in background wait $PID #wait for command1, in background, to end command3 #execute once command1 ended 

Po úpravách, protože máte více PID a znáte je, můžete to udělat:

command1 & #run command1 in background PID1=xxxxx PID2=yyyyy PID3=xxyyy PID4=yyxxx command2 #run command2 while command1 is running in background wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end command3 #execute once command1 ended 

Komentáře

  • Po provedení úpravy, pokud víte, že byl vytvořen PID (xxxxx, yyyyy, xxyyy, yyxxx ), můžete také použít wait, se seznamem PID, na které se má čekat (viz man). Pokud je neznáte ', můžete je shromáždit do příkazu1 (jaký je příkaz1? Vlastní skript?)
  • Pravděpodobně nejlépe zajistit, aby ' se nejprve seskupil správně. V mé odpovědi najdete představu, jak by to mohlo být provedeno.

Odpověď

Nejčistší způsob, jak toho dosáhnout by bylo mít comamnd1 vrátit PID spuštěných procesů a pomocí wait na každém z nich, jak navrhuje @LaurentC „s odpověď .

Jiný přístup by vypadal takto:

## Create a log file logfile=$(mktemp) ## Run your command and have it print into the log file ## when it"s finsihed. command1 && echo 1 > $logfile & ## Wait for it. The [ ! -s $logfile ] is true while the file is ## empty. The -s means "check that the file is NOT empty" so ! -s ## means the opposite, check that the file IS empty. So, since ## the command above will print into the file as soon as it"s finished ## this loop will run as long as the previous command si runnning. while [ ! -s $logfile ]; do sleep 1; done ## continue command2 

Komentáře

  • omlouvám se, ale stále nefunguje .. Znovu svoji otázku vylepším!

Odpovědět

Pokud použijete následující metodu, možná nebudete po smyčce while potřebovat speciální „počkat na všechny procesy“. Smyčka počká na aktuální command1 k dokončení dříve, než se cykluje zpět nahoru. Používejte prosím péči jako u každé rady. Všimněte si, jediné, co jsem udělal, bylo přidání & wait $! na konec div id = „c511827217″>

.

a=1 while [$a -lt 4 ] . command1 & wait $! #Generates 1 Process a= `export $a +1` done 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *