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
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
command1
? Můžete jej upravit tak, aby vracel PID 4 procesů?$!
a předat ji příkazuwait
, jak jsem tam ukázal.$!
obsahuje poslední PID na pozadí, zatímco$$
obsahuje poslední běh procesu ' s PID .