GNU/Linux >> Znalost Linux >  >> Linux

Příkaz Wait v Linuxu s příklady

Wait je příkaz shellu, který čeká na dokončení daného procesu a poté vrátí stav ukončení. Příkaz Wait se používá k čekání buď na konkrétní ID procesu a ID úlohy a na vrácení jejich stavu ukončení.

Při provádění velkého automatizačního toku potřebujeme, aby několik modulů čekalo na dokončení předchozí sady modulů a vrátilo data zřetězená do dalších modulů, v tomto případě můžeme použít příkaz Wait, dokud nedokončí předchozí modul.

Jak funguje příkaz wait

Příkaz Wait používaný k monitorování předchozího procesu, závisí na stavu návratu předchozího procesu, vrátí stav ukončení. Pokud například chceme počkat na dokončení konkrétního procesu ID 13245, měli bychom použít „wait 13245“, když příkaz procesu 13245 complete wait vrátí návratové hodnoty stavu ukončení 13245.

- wait PID (PID - ID procesu příkazu, u kterého má utilita čekat na ukončení).
- wait JID (JID - Job ID, které identifikuje proces na pozadí, na který se má čekat, použitelné pouze pro vyvolání čekání v aktuálním prostředí spouštění shellu).

Hodnota výstupního stavu příkazu čekání závisí na posledním zadaném PID/JID. Když se jakýkoli proces ukončí abnormálně, bude stav ukončení vyšší než 128.

Příkaz Wait se ukončí s hodnotou 0 když volá bez podřízeného procesu a všechna ID procesů zná aktuální shell, byly ukončeny. Pokud příkaz wait detekuje nějakou chybu, vrátí libovolnou hodnotu od 1 do 126. Pokud je poslední ID procesu neznámé, příkaz wait skončí s hodnotou 127.

Příklady příkazů Wait

Pojďme se podívat na několik skriptů, abychom pochopili, jak příkaz wait funguje.

Příklad:1 – Skript s příkazem Wait

Máme dva skripty nazvané 'foo.sh' a 'bar.sh' script. Skript 'Foo.sh' tiskne čísla mezi 1 až 5 a skript 'bar.sh' zavolá foo.sh a spustí ho na pozadí, získá PID foo.sh a počká na jeho dokončení, jakmile bude dokončen, bude spusťte smyčku 'bar.sh' a dokončete ji.

Skript – foo.sh

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Skript – bar.sh

#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
pid=$!
wait $pid
echo “Completed foo.sh”

for I in 1 2 3 4 5
do
        echo “bar.sh – Looping … number $i”
done

Výsledek

Started bar.sh
Started foo.sh
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$

Příklad 2 – Skript bez příkazu čekání

Máme dva skripty nazvané 'foo.sh' a 'bar.sh' script. Skript 'foo.sh' tiskne čísla mezi 1 až 5 a skript bar.sh zavolá foo.sh a spustí jej na pozadí, ale nebude čekat, až foo.sh dokončí a provede oba skripty.

Skript – foo.sh

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Skript – bar.sh

#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
echo “Completed foo.sh”

for I in 1 2 3 4 5
do
        echo “bar.sh – Looping … number $i”
done

Výsledek

Started bar.sh
Started foo.sh
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
$

Příklad:3 – Skript s příkazem čekání a návratovým stavem

Skript 'bar.sh' zavolá foo.sh a spustí ho na pozadí, získá PID foo.sh a počká na jeho dokončení, jakmile se dokončí, spustí se smyčka bar.sh a dokončí se. Nakonec vrátí výstupní kód skriptu foo.sh.

Skript – foo.sh (stav ukončení =0)

Skript – foo.sh

#!/bin/bash
for i in 1 2 3 4 5
do
      echo “foo.sh – Looping … number $i”
done

Skript – bar.sh

#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?

if [ $stat –eq 0 ]
then
       echo “Exit status - $stat”
else
        echo “Exit status - $stat”
fi

Výsledek

foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Exit status - 0
$

Skript – foo.sh (stav ukončení =NON Zero)

Skript – foo.sh

#!/bin/bash
for i in 1 2 3 4 5
do
      iiecho “foo.sh – Looping … number $i”
done

Skript – bar.sh

#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?

if [ $stat –eq 0 ]
then
       echo “Exit status - $stat”
else
        echo “Exit status - $stat”
fi

Výsledek

./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
Exit status – 127
$

Závěr

Čekání a spánek jsou systémová volání operačního systému založená na čase. Podívejme se na rozdíl mezi příkazem čekat a uspat.

Čekat:Když chce uživatel zastavit aktuální proces a ten uvolní všechny prostředky držené procesem a čeká na provedení nějakého jiného procesu. Potřebujeme použít notify, abychom tento proces upozornili, že po dokončení jiného procesu se znovu spustí.

Spánek:Toto systémové volání se používá, když chce uživatel na nějakou dobu zastavit aktuální proces. Udržuje zámky na zdrojích, dokud neskončí doba spánku, a znovu spustí provádění procesu. Zde má proces kontrolu po celou dobu provádění. např. jsem provedl nějaký příkaz na bash a chci nějakou dobu spát, protože očekávám nějaký výstup z provedeného příkazu, který bude využit při dalším provádění aktuálního procesu.


Linux
  1. Linux Tee Command s příklady

  2. Příkaz linuxové hlavy s příklady

  3. JQ Command v Linuxu s příklady

  1. wc Linux Command s příklady

  2. Linux řazení příkazů s příklady

  3. Echo Command v Linuxu (s příklady)

  1. man Command v Linuxu s příklady

  2. Příkaz AWK v Linuxu s příklady

  3. Curl Command v Linuxu s příklady