Bash wait Parancs példákkal

A Bash várakozási parancsa egy hatékony eszköz a shell script folyamatok kezelésére. Elsősorban egy szkript végrehajtásának szüneteltetésére szolgál, amíg a megadott háttérfolyamat be nem fejeződik. Ez a parancs hasznos olyan szkriptekben, amelyek több háttérfeladatot kezdeményeznek, és a további feladatok elvégzése előtt szinkronizálniuk kell azok befejezését. A várakozás parancs alkalmazható az egyes folyamatazonosítókra (PID), vagy arra, hogy megvárja az aktuális shell-munkamenet által kezdeményezett összes háttérfolyamatot. A várakozás használatával biztosíthatja, hogy a szkript csak akkor haladjon előre, ha bizonyos feladatokat teljesen befejeztek, így az automatizálási folyamatok megbízhatóbbak és hatékonyabbak lesznek.

Ez az útmutató gyakorlati példákat kínál a wait parancs használatára különféle forgatókönyvekben, és segít megérteni, hogyan kezelheti hatékonyan a háttérfolyamatokat a Bash-szkriptekben.

A Bash wait parancs megértése

A Bash várakozási parancsa egy beépített függvény, amely leállítja az aktuális shell végrehajtását, amíg a megadott jobok be nem fejeződnek. Ezután visszaadja annak a parancsnak a kilépési állapotát, amelyre várt. Ez a parancs döntő szerepet játszik a shell-végrehajtási környezetben, és mint ilyen, a legtöbb shellbe be van építve.

A wait parancs általános szintaxisa a következő:

wait [ID]

Ebben az összefüggésben az azonosító a folyamat- vagy feladatazonosítót jelöli. Ha nincs megadva azonosító, a várakozás parancs szünetel, amíg az összes alárendelt háttérfeladat be nem fejeződik. A várakozás parancs az utoljára várt parancs kilépési állapotát adja vissza.

Például egy PID 7654-es háttérfolyamat szüneteltetéséhez a következőket kell használnia:

wait 7654

Ha több folyamat van megadva, a várakozás parancs szünetel, amíg azok be nem fejeződnek.

Navigálás a feladat specifikációi között a bash wait paranccsal

A feladatok a jobspecifikáció (jobspec) segítségével vannak megadva, amely a feladatot alkotó folyamatokra vonatkozik. A jobspecifikáció százalékos szimbólummal kezdődik, amelyet a feladat száma (%n) követ. Íme egy példa:

rsync -a /home /tmp/home &

Ez a parancs a háttérben fut. A shell job ID (zárójelben) és a folyamatazonosító megjelenik a terminálon. A feladat szüneteltetéséhez futtassa a Várakozás parancsot, majd a feladat specifikációját:

wait %2

A -n Opció használata a bash wait paranccsal

Az -n kapcsoló lehetővé teszi, hogy a várakozás parancs csak egy job befejeződéséig szüneteljen az adott PID-kből vagy jobspecifikációkból, és visszaadja a kilépési állapotát. Ha nem ad meg argumentumot, akkor az -n megvárja, hogy minden háttérfeladat befejeződjön, és visszaadja a job kilépési állapotát.

wait -n 45432 54346 76573

A fenti példában a várakozás -n csak az elsőként kilépő munka visszatérési állapotát írja ki; nem mutatja a feladat PID-jét. Ha azt a job PID-t vagy jobspec-et szeretné lekérni, amelyhez a kilépési állapotot visszaküldi, használja a -p lehetőség, hogy hozzárendelje egy változóhoz:

wait -p job_id -n 45432 54346 76573

A -p opciót a Bash 5.1-ben vezették be. Régebbi Bash-verzió használata „érvénytelen beállítás” hibát eredményez.

Az -f opció felfedezése a bash wait paranccsal

Az -f kapcsoló arra utasítja a szünetre való várakozást, hogy minden egyes PID vagy jobspecifikáció véget ér, mielőtt visszaadná a kilépési kódját, nem pedig a job állapotának megváltozásakor. Ez a beállítás csak akkor érvényes, ha a jobvezérlés engedélyezve van, amely alapértelmezés szerint csak az interaktív promptoknál van engedélyezve.

Gyakorlati példák a várakozás parancsra

A várakozás parancsot általában olyan shell-szkriptekben használják, amelyek párhuzamosan futó gyermekfolyamatokat generálnak. A parancs működésének szemléltetésére hozzuk létre a következő szkriptet:

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"

Bontsuk soronként a kódot:

  • Az első sor, a shebang, megmondja az operációs rendszernek, hogy melyik értelmezőt használja a fájl többi részének elemzéséhez.
  • Az alvás parancsot egy időigényes háttérfolyamat emulálására használjuk.
  • $! egy belső Bash-változó, amely a háttérben tárolja az utolsó futtatott job PID-jét. Ebben a példában ez az alvásparancs PID-je. A PID-t egy változóban tároljuk (process_id).
  • A PID szám ki lesz nyomtatva.
  • A PID átadásra kerül a várakozás parancsnak, amely szünetel, amíg az alvás parancs be nem fejeződik.
  • A várakozás parancs kilépési állapota kinyomtatásra kerül. $? egy belső Bash változó, amely az utoljára végrehajtott parancs kilépési állapotát tartalmazza.

Ha futtatja a szkriptet, valami ilyesmit fog nyomtatni:

PID: 36353
Exit status: 0

Íme egy példa az -n kapcsoló használatára:

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

Amikor a szkript végrehajtódik, 3 háttérfolyamatot indít el. vár -n szünetel, amíg az első feladat befejeződik és az echo utasítás kinyomtatásra kerül. várjon szüneteket, amíg az összes alárendelt háttérmunka befejeződik.

First job completed.
All jobs completed.

Az utolsó példa az -f kapcsolót magyarázza. Nyissa meg a terminált, és futtassa:

sleep 3600 &
[1] 46671
wait 46671

Nyisson meg egy másik terminált, és állítsa le a folyamatot a kill paranccsal:

kill -STOP 46671

Ha a folyamat állapota megváltozik, a várakozás parancs befejeződik, és a folyamat kilépési kódja visszaadásra kerül.

Most ismételje meg ugyanazokat a lépéseket, de ezúttal használja a wait -f $pid parancsot:

sleep 3600 &
wait -f 46671

Állítsa le a folyamatot a másik terminálról:

kill -STOP 46671

Ezúttal a várakozás parancs nem lesz teljes. Addig fut, amíg az alvási folyamat le nem fejeződik.

A várakozás parancs speciális használata

A várakozás parancs különösen akkor válik hasznossá, ha egy parancsfájlban több folyamatot kezel. Lehetővé teszi a végrehajtási folyamat vezérlését és annak biztosítását, hogy bizonyos folyamatok befejeződjenek, mielőtt mások elkezdenék. Ennek illusztrálására nézzünk néhány összetettebb példát.

Bash több folyamatra vár

Vegyünk egy olyan forgatókönyvet, amelyben több folyamat fut a háttérben, és csak azok befejezése után kell cselekednie. A következőképpen használhatja ezt a wait parancsot:

#!/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."

Ez a szkript három háttérfolyamatot indít el, amelyek 10, 15, illetve 20 másodpercig alszanak. Minden folyamat PID-jét egy változóban tároljuk. Ezután a várakozás parancsot mindhárom PID-vel argumentumként használjuk. A szkript a várakozás parancsra szünetel, amíg mindhárom folyamat be nem fejeződik.

Bash használata, várjon hurokkal

Több folyamat kezeléséhez is használhatja a várakozást ciklussal. Íme egy példa:

#!/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."

Ebben a szkriptben öt háttérfolyamatot indítunk el egy cikluson belül. Mindegyik folyamat néhány másodpercig alszik, ami megegyezik a hurokban lévő indexével. Minden folyamat PID-jét egy tömbben tároljuk. Az összes folyamat elindítása után körbefutjuk a tömböt, és a wait paranccsal minden folyamatot külön-külön szüneteltetünk. A szkript minden várakozási parancsnál szünetel, amíg a megfelelő folyamat be nem fejeződik.

Következtetés

A Bash várakozási parancsa elengedhetetlen a szkripteken belüli háttérfolyamatok szinkronizálásához. A várakozás használatának megértésével pontosabban szabályozhatja a szkript folyamát, biztosítva, hogy a feladatok a kívánt sorrendben történjenek. Akár több háttérfeladatról van szó, akár egy adott folyamat befejezését kell biztosítania a folytatás előtt, a wait parancs segítségével megbízhatóbb és kiszámíthatóbb szkript viselkedést érhet el. Fontolja meg a várakozás integrálását szkriptjeibe a folyamatkezelés javítása és a szkriptek általános hatékonyságának javítása érdekében.

Joshua James

Szólj hozzá!