wait
je příkaz, který čeká na dokončení daných úloh a vrací stav ukončení příkazu čekalo na něj.
Protože wait
příkaz ovlivňuje aktuální prostředí provádění shellu, je implementován jako vestavěný příkaz ve většině shellů.
V tomto článku prozkoumáme vestavěný wait
v Bash příkaz.
Bash wait
Příkaz #
Obecná syntaxe wait
vestavěný má následující podobu:
wait [options] ID
ID
je ID procesu nebo úlohy. Pokud žádné ID
je zadáno, příkaz čeká, dokud nebudou dokončeny všechny podřízené úlohy na pozadí.
wait
příkaz vrátí stav ukončení posledního čekajícího příkazu.
Chcete-li například čekat na proces na pozadí s PID 7654
, použili byste:
wait 7654
Když je zadáno více procesů, příkaz čeká na dokončení všech procesů.
Úlohy jsou specifikovány pomocí specifikace úlohy (“jobspec”), což je způsob, jak odkazovat na procesy, které tvoří úlohu. Specifikace úlohy začíná symbolem procenta následovaným číslem úlohy (%n
). Zde je příklad:
Spusťte příkaz na pozadí:
rsync -a /home /tmp/home &
ID úlohy shellu (v závorkách) a ID procesu se zobrazí na vašem terminálu:
[2] 54377
Chcete-li na úlohu počkat, spusťte příkaz wait
příkaz následovaný specifikací úlohy:
wait %2
Při vyvolání pomocí -n
příkaz čeká pouze na dokončení jedné úlohy z daných pid nebo specifikací úlohy a vrátí svůj výstupní stav. Pokud nejsou zadány žádné argumenty, wait -n
čeká na dokončení jakékoli úlohy na pozadí a vrátí se do stavu ukončení úlohy.
wait -n 45432 54346 76573
Ve výše uvedeném příkladu wait -n
vytiskne pouze návratový stav úlohy, která skončí jako první; neukazuje PID úlohy. Pokud chcete získat pid úlohy nebo specifikaci úlohy, pro kterou je vrácen stav ukončení, použijte -p
možnost přiřadit jej k proměnné:
wait -p job_id -n 45432 54346 76573
-p
možnost byla představena v Bash 5.1. Pokud používáte starší verzi Bash, zobrazí se chyba „neplatná možnost“.
-f
volba říká wait
počkat, až se každý pid nebo jobspec skutečně ukončí, než vrátí svůj výstupní kód, místo aby se vrátil při změně stavu úlohy. Tato možnost je platná pouze v případě, že je povoleno řízení úlohy. Ve výchozím nastavení je řízení úloh povoleno pouze pro interaktivní výzvy.
Příklady #
wait
se obvykle používá ve skriptech shellu, které vytvářejí podřízené procesy, které se spouštějí paralelně.
Chcete-li ilustrovat, jak příkaz funguje, vytvořte následující skript:
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
Pojďme si vysvětlit kód řádek po řádku:
- První řádek se nazývá shebang a říká operačnímu systému, který interpret má použít k analýze zbytku souboru.
- Používáme
sleep
příkaz k emulaci časově náročného procesu na pozadí. $!
je interní Bash proměnná, která ukládá PID poslední spuštěné úlohy na pozadí. V tomto příkladu je to PIDsleep
příkaz. PID ukládáme do proměnné (process_id
).- Vytiskne číslo PID.
- PID je předán do
wait
příkaz, který čeká, dokud sesleep
příkaz se dokončí. - Vytiskne stav ukončení
wait
příkaz.$?
je interní Bash proměnná, která uchovává stav ukončení posledního provedeného příkazu.
Pokud skript spustíte, vypíše něco takového:
PID: 36353
Exit status: 0
Zde je příklad pomocí -n
možnost:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
Když je skript spuštěn, spustí 3 procesy na pozadí. wait -n
čeká na dokončení první úlohy a vytištění příkazu echo. wait
čeká na dokončení všech podřízených úloh na pozadí.
first job completed
all jobs completed
Poslední příklad vysvětluje -f
volba. Otevřete terminál a spusťte:
sleep 3600 &
[1] 46671
Počkejte na proces:
wait 46671
Otevřete další terminál a zastavte proces pomocí kill
příkaz:
kill -STOP 46671
Jakmile se stav procesu změní, wait
příkaz dokončí a vrátí kód ukončení procesu.
Nyní opakujte stejné kroky, ale tentokrát použijte wait -f $pid
:
sleep 3600 &
wait -f 46671
Zastavte proces z druhého terminálu:
kill -STOP 46671
Tentokrát wait
příkaz nebude dokončen. Poběží, dokud sleep
proces skončí.
Závěr č.
wait
příkaz čeká na dokončení zadaných úloh a vrátí kód ukončení úlohy.