počkaj
je príkaz, ktorý čaká na dokončenie zadaných úloh a vráti stav ukončenia čakaného príkazu.
Keďže počkaj
príkaz ovplyvňuje súčasné prostredie vykonávania shellu, je implementovaný ako vstavaný príkaz vo väčšine škrupín.
V tomto článku preskúmame zabudovanú technológiu Bash počkaj
príkaz.
Bash počkaj
Príkaz #
Všeobecná syntax súboru počkaj
vstavaný má nasledujúcu formu:
počkajte [možnosti] ID
ID
je ID procesu alebo úlohy. Ak nie ID
je zadané, príkaz počká, kým sa nedokončia všetky podradené úlohy na pozadí.
The počkaj
príkaz vráti stav ukončenia posledného čakaného príkazu.
Napríklad čakať na proces na pozadí s PID 7654
, použili by ste:
počkaj 7654
Keď je zadaných viac procesov, príkaz čaká na dokončenie všetkých procesov.
Úlohy sa špecifikujú pomocou špecifikácie úlohy („jobspec“), čo je spôsob, ako odkazovať na procesy, ktoré tvoria úlohu. Úloha sa začína symbolom percenta, za ktorým nasleduje číslo úlohy (% n
). Tu je príklad:
Spustite príkaz na pozadí:
rsync -a / home / tmp / home &
ID úlohy shellu (obklopené zátvorkami) a ID procesu sa zobrazia na vašom termináli:
[2] 54377
Ak chcete počkať na úlohu, spustite počkaj
príkaz nasledovaný špecifikáciou úlohy:
čakaj% 2
Pri vyvolaní pomocou -n
voľba, príkaz čaká iba na dokončenie jednej úlohy z daných pidov alebo úloh, a vráti jej stav ukončenia. Ak nie sú poskytnuté žiadne argumenty, počkaj -n
čaká na dokončenie akejkoľvek úlohy na pozadí a vráti stav ukončenia úlohy.
počkať -n 45432 54346 76573
V príklade vyššie, počkaj -n
vytlačí iba stav vrátenia úlohy, ktorá končí ako prvá; nezobrazuje PID úlohy. Ak chcete získať pid úlohy alebo jobspec, pre ktoré sa vráti stav ukončenia, použite -p
možnosť priradiť ho k premennej:
čakať -p job_id -n 45432 54346 76573
-p
táto možnosť bola predstavená v Bash 5.1. Ak používate staršiu verziu nástroja Bash, zobrazí sa chyba „neplatná možnosť“.
The -f
možnosť hovorí počkaj
namiesto vrátenia, keď sa zmení stav úlohy, počkať na skutočné ukončenie každého identifikátora pid alebo úlohy. Táto možnosť je platná, iba ak je povolené riadenie úloh. V predvolenom nastavení je kontrola úlohy povolená iba pre interaktívne výzvy.
Príklady #
počkaj
sa zvyčajne používa v shell skriptoch, ktoré vytvárajú podradené procesy, ktoré sa spúšťajú paralelne.
Na ilustráciu fungovania príkazu vytvorte nasledujúci skript:
#!/ bin / bash sleep 30 & process_id = $! echo "PID: $ process_id" čakať $ process_id echo "Výstupný stav: $?„
Poďme si vysvetliť kódový riadok po riadku:
- Prvý riadok sa volá shebang a informuje operačný systém, ktorý tlmočník má použiť na analýzu zvyšku súboru.
- Používame
spať
príkaz na emuláciu časovo náročného procesu na pozadí. $!
je interná premenná Bash, ktorá ukladá PID poslednej spustenej úlohy na pozadí. V tomto príklade to je PID zspať
príkaz. Ukladáme PID do premennej (process_id
).- Vytlačí PID číslo.
- PID sa odovzdá
počkaj
príkaz, ktorý čaká naspať
príkaz je dokončený. - Vytlačí stav ukončenia
počkaj
príkaz.$?
je interná premenná Bash, ktorá uchováva stav ukončenia posledného vykonaného príkazu.
Ak spustíte skript, vytlačí sa asi takto:
PID: 36353 Výstupný stav: 0
Tu je príklad použitia -n
možnosť:
#!/ bin / bash spánok 3 a spánok 30 a spánok 5 a čakanie -n echo „Prvá úloha dokončená.„wait echo“ Všetky úlohy dokončené.„
Keď je skript spustený, zobrazí sa 3 procesy na pozadí. počkaj -n
počká, kým sa dokončí prvá úloha a nevytlačí sa príkaz echo. počkaj
čaká na dokončenie všetkých detských pozícií v pozadí.
prvá úloha dokončená všetky úlohy dokončené
Posledný príklad vysvetľuje -f
možnosť. Otvorte terminál a spustite:
spať 3600 a
[1] 46671
Počkajte na postup:
počkaj 46671
Otvorte ďalší terminál a zastavte proces pomocou zabiť
príkaz:
zabiť -STOP 46671
Po zmene stavu procesu sa zobrazí počkaj
príkaz dokončí a vráti výstupný kód procesu.
Teraz zopakujte rovnaké kroky, ale tentokrát ich použite počkaj -f $ pid
:
spať 3600 a
počkaj -f 46671
Zastavte proces z druhého terminálu:
zabiť -STOP 46671
Tentokrát počkaj
príkaz sa nedokončí. Bude trvať až do spať
proces sa ukončí.
Záver #
The počkaj
príkaz čaká na dokončenie zadaných úloh a vráti výstupný kód úlohy.
Ak máte akékoľvek otázky alebo spätnú väzbu, neváhajte zanechať komentár.