Počkejte
je příkaz, který čeká na dokončení zadaných úloh a vrací stav ukončení čekaného příkazu.
Protože Počkejte
příkaz ovlivňuje aktuální prostředí pro 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ý Bash Počkejte
příkaz.
Bash Počkejte
Příkaz #
Obecná syntaxe souboru Počkejte
vestavěný má následující podobu:
počkejte [možnosti] ID
ID
je ID procesu nebo úlohy. Jestli ne ID
je zadán, příkaz čeká, dokud nebudou dokončeny všechny podřízené úlohy na pozadí.
The Počkejte
příkaz vrátí stav ukončení posledního čekaného příkazu.
Například čekat na proces na pozadí s PID 7654
, byste použili:
počkejte 7654
Pokud je zadáno více procesů, příkaz čeká na dokončení všech procesů.
Úlohy se zadávají 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 počkat na úlohu, spusťte Počkejte
příkaz následovaný specifikací úlohy:
počkejte% 2
Při vyvolání pomocí -n
Možnost čeká na dokončení pouze jedné úlohy z daných pidů nebo specifikací úloh a vrátí její stav ukončení. Pokud nejsou poskytnuty žádné argumenty, počkejte -n
čeká na dokončení jakékoli úlohy na pozadí a vrátí stav ukončení úlohy.
počkat -n 45432 54346 76573
Ve výše uvedeném příkladu, počkejte -n
vytiskne pouze návratový stav úlohy, která skončí jako první; nezobrazuje PID úlohy. Chcete-li získat pid úlohy nebo specifikaci úloh, pro které je vrácen stav ukončení, použijte -p
možnost jej přiřadit k proměnné:
počkat -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á volba“.
The -F
volba říká Počkejte
čekat, až se každý pid nebo jobpec skutečně ukončí před vrácením kódu ukončení, místo aby se vrátil při změně stavu úlohy. Tato možnost je platná, pouze pokud je povolena kontrola úlohy. Ve výchozím nastavení je řízení úlohy povoleno pouze pro interaktivní výzvy.
Příklady #
Počkejte
se obvykle používá ve skriptech prostředí, které vytvářejí podřízené procesy, které se spouštějí paralelně.
Pro ilustraci fungování příkazu vytvořte následující skript:
#!/ bin / bash sleep 30 & process_id = $! echo "PID: $ process_id" počkat $ process_id echo "Ukončit stav: $?"
Vysvětlíme kód po řádku:
- První řádek se nazývá shebang a říká operačnímu systému, který tlumočník má použít k analýze zbytku souboru.
- Používáme
spát
příkaz k emulaci časově náročného procesu na pozadí. $!
je interní proměnná Bash, která ukládá PID poslední spuštěné úlohy na pozadí. V tomto příkladu je to PID zspát
příkaz. Ukládáme PID do proměnné (process_id
).- Vytiskne číslo PID.
- PID je předán do
Počkejte
příkaz, který čeká naspát
příkaz je dokončen. - Vytiskne stav ukončení
Počkejte
příkaz.$?
je interní proměnná Bash, která udržuje stav ukončení posledního provedeného příkazu.
Pokud spustíte skript, vytiskne se něco takového:
PID: 36353 Stav ukončení: 0
Zde je příklad použití -n
volba:
#!/ bin / bash spánek 3 & spánek 30 & spánek 5 & čekání -n echo "První úloha dokončena."počkat echo" Všechny úlohy dokončeny."
Když je skript spuštěn, zobrazí se 3 procesy na pozadí. počkejte -n
čeká, až je dokončena první úloha a je vytištěn příkaz echo. Počkejte
čeká na dokončení všech podřízených úloh na pozadí.
první úloha dokončena všechny úlohy dokončeny
Poslední příklad vysvětluje -F
volba. Otevřete terminál a spusťte:
spát 3600 a
[1] 46671
Počkejte na proces:
počkej 46671
Otevřete jiný terminál a zastavte proces pomocí zabít
příkaz:
zabít -STOP 46671
Po změně stavu procesu se zobrazí Počkejte
příkaz dokončí a vrátí kód ukončení procesu.
Nyní opakujte stejné kroky, ale tentokrát použijte počkat -f $ pid
:
spát 3600 a
počkat -f 46671
Zastavte proces z druhého terminálu:
zabít -STOP 46671
Tentokrát Počkejte
příkaz nebude dokončen. Bude to trvat až do spát
proces končí.
Závěr #
The Počkejte
příkaz čeká na dokončení zadaných úloh a vrátí kód ukončení úlohy.
Máte-li jakékoli dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.