Bash wait Příkaz s příklady

Příkaz wait v Bash je mocný nástroj pro správu procesů skriptů shellu. Primárně se používá k pozastavení provádění skriptu, dokud nebude dokončen zadaný proces na pozadí. Tento příkaz je užitečný ve skriptech, které spouštějí více úloh na pozadí a potřebují synchronizovat jejich dokončení před pokračováním v dalších úlohách. Příkaz wait lze použít na ID jednotlivých procesů (PID) nebo na čekání na všechny procesy na pozadí iniciované aktuální relací shellu. Pomocí funkce čekání můžete zajistit, že se váš skript posune vpřed pouze po úplném dokončení konkrétních úkolů, díky čemuž budou vaše automatizační procesy spolehlivější a efektivnější.

Tato příručka poskytne praktické příklady použití příkazu wait v různých scénářích a pomůže vám pochopit, jak efektivně spravovat procesy na pozadí ve vašich skriptech Bash.

Pochopení příkazu Bash wait

Příkaz čekání v Bash je vestavěná funkce, která zastaví provádění aktuálního shellu, dokud nebudou dokončeny zadané úlohy. Poté vrátí návratový stav příkazu, na který čekal. Tento příkaz hraje klíčovou roli v prostředí spouštění shellu a jako takový je zabudován do většiny shellů.

Obecná syntaxe příkazu wait je následující:

wait [ID]

V tomto kontextu ID představuje ID procesu nebo úlohy. Pokud není zadáno žádné ID, příkaz wait se pozastaví, dokud nebudou dokončeny všechny podřízené úlohy na pozadí. Příkaz čekání vrátí stav ukončení posledního příkazu, na který čekal.

Chcete-li například pozastavit proces na pozadí s PID 7654, použijte:

wait 7654

Pokud je zadáno více procesů, příkaz wait se pozastaví, dokud nebudou dokončeny.

Procházení specifikací úlohy pomocí příkazu bash wait

Úlohy jsou specifikovány pomocí specifikace úlohy (jobspec), která odkazuje na procesy, které tvoří úlohu. Specifikace úlohy začíná symbolem procenta následovaným číslem úlohy (%n). Zde je příklad:

rsync -a /home /tmp/home &

Tento příkaz běží na pozadí. ID úlohy shellu (v závorkách) a ID procesu se zobrazí na vašem terminálu. Chcete-li úlohu pozastavit, spusťte příkaz wait následovaný specifikací úlohy:

wait %2

Použití volby -n s příkazem bash wait

Volba -n umožňuje, aby se příkaz wait pozastavil pouze na dokončení jedné úlohy z daných PID nebo specifikací úlohy a vrátí stav ukončení. Pokud nejsou zadány žádné argumenty, čeká -n čeká na dokončení jakékoli úlohy na pozadí a vrátí stav 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í; nezobrazuje 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

Volba -p byla zavedena v Bash 5.1. Použití starší verze Bash bude mít za následek chybu „neplatná možnost“.

Prozkoumání volby -f pomocí příkazu bash wait

Volba -f dává pokyn, aby se čekání na pozastavení pro každý PID nebo specifikaci úlohy ukončilo před vrácením jeho ukončovacího kódu, místo aby se vrátilo při změně stavu úlohy. Tato možnost je platná pouze v případě, že je povoleno řízení úloh, které je ve výchozím nastavení povoleno pouze pro interaktivní výzvy.

Praktické příklady čekacího příkazu

Příkaz wait se obvykle používá ve skriptech shellu, které vytvářejí podřízené procesy, které se spouštějí paralelně. Abychom ilustrovali, 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 kód rozebrat řádek po řádku:

  • První řádek, shebang, říká operačnímu systému, který interpret má použít k analýze zbytku souboru.
  • Používáme příkaz sleep 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 PID příkazu sleep. PID ukládáme do proměnné (process_id).
  • Vytiskne se číslo PID.
  • PID je předán příkazu čekání, který se pozastaví, dokud se příkaz spánku nedokončí.
  • Vytiskne se stav ukončení příkazu čekání. $? 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 použití volby -n:

#!/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 se pozastaví, dokud se nedokončí první úloha a nevytiskne se příkaz echo. čekací pauzy na dokončení všech podřízených úloh na pozadí.

First job completed.
All jobs completed.

Poslední příklad vysvětluje volbu -f. Otevřete terminál a spusťte:

sleep 3600 &
[1] 46671
wait 46671

Otevřete jiný terminál a zastavte proces příkazem kill:

kill -STOP 46671

Jakmile se stav procesu změní, příkaz čekání bude dokončen a vrátí se 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 jiného terminálu:

kill -STOP 46671

Tentokrát nebude příkaz čekání dokončen. Poběží, dokud se neukončí proces spánku.

Pokročilé použití příkazu wait

Příkaz wait se stává zvláště užitečným při správě více procesů ve skriptu. Umožňuje vám řídit tok provádění a zajistit, že konkrétní procesy byly dokončeny dříve, než začnou ostatní. Pojďme se ponořit do některých složitějších příkladů, abychom to ilustrovali.

Bash čeká na více procesů

Zvažte scénář, kdy na pozadí běží více procesů a vy musíte jednat až po jejich dokončení. Zde je návod, jak toho můžete dosáhnout pomocí příkazu wait:

#!/bin/bash
echo "Starting process 1..."
sleep 10 &
pid1=$!

echo "Starting process 2..."
sleep 15 &
pid2=$!

echo "Starting process 3..."
sleep 20 &
pid3=$!

echo "Waiting for processes to complete..."
wait $pid1 $pid2 $pid3
echo "All processes completed."

Tento skript spustí tři procesy na pozadí, které spí 10, 15 a 20 sekund. Ukládáme PID každého procesu do proměnné. Poté použijeme příkaz wait se všemi třemi PID jako argumenty. Skript se na příkazu wait pozastaví, dokud nebudou dokončeny všechny tři procesy.

Použití Bash čekání se smyčkou

Čekání se smyčkou můžete také použít ke správě více procesů. Zde je příklad:

#!/bin/bash
for i in {1..5}
do
   echo "Starting process $i..."
   sleep $i &
   pids[${i}]=$!
done

echo "Waiting for processes to complete..."
for pid in ${pids[*]}; do
    wait $pid
done

echo "All processes completed."

V tomto skriptu spouštíme pět procesů na pozadí ve smyčce. Každý proces uspí na několik sekund rovnající se jeho indexu ve smyčce. Ukládáme PID každého procesu do pole. Po spuštění všech procesů procházíme polem a pomocí příkazu wait pozastavíme každý proces jednotlivě. Skript se při každém příkazu čekání pozastaví, dokud nebude odpovídající proces dokončen.

Závěr

Příkaz wait v Bash je nezbytný pro synchronizaci procesů na pozadí ve vašich skriptech. Když pochopíte, jak používat čekání, můžete přesněji řídit tok skriptu a zajistit, že úkoly budou dokončeny v požadovaném pořadí. Ať už máte co do činění s více úlohami na pozadí nebo musíte zajistit dokončení určitého procesu před pokračováním, příkaz wait vám může pomoci dosáhnout spolehlivějšího a předvídatelnějšího chování skriptu. Zvažte integraci čekání do vašich skriptů, abyste zlepšili správu procesů a zlepšili celkovou efektivitu skriptů.

Joshua James
Následuj mě
Nejnovější příspěvky uživatele Joshua James (vidět vše)

Napsat komentář