počakaj
je ukaz, ki čaka, da se določena opravila zaključijo, in vrne status izhoda čakalnega ukaza.
Ker je počakaj
ukaz vpliva na trenutno okolje izvajanja lupine in je vgrajen v večino lupin.
V tem članku bomo raziskali vgrajeni Bash počakaj
ukaz.
Baš počakaj
Ukaz št
Splošna sintaksa počakaj
vgrajena ima naslednjo obliko:
počakajte [možnosti] ID
ID
je ID ali ID delovnega mesta. Če ne ID
je ukaz počakan, dokler niso dokončana vsa podrejena opravila v ozadju.
The počakaj
ukaz vrne stanje izhoda zadnjega čakanega ukaza.
Na primer, počakati na postopek v ozadju s PID 7654
, bi uporabili:
počakaj 7654
Ko je podanih več procesov, ukaz čaka, da se vsi procesi zaključijo.
Opravila so določena s specifikacijo opravila (“jobspec”), ki pomeni način sklicevanja na procese, ki sestavljajo opravilo. Poslovna točka se začne s simbolom za odstotek, ki mu sledi številka opravila (% n
). Tu je primer:
Zaženite ukaz v ozadju:
rsync -a / home / tmp / home &
ID terminala lupine (obdan z oklepaji) in ID procesa bosta prikazana na vašem terminalu:
[2] 54377
Če želite počakati na delo, zaženite počakaj
ukaz, ki mu sledi specifikacija opravila:
počakaj% 2
Ko se prikliče z -n
Možnost čaka, da ukaz čaka samo na eno opravilo iz danih pidov ali opravil in ga vrne v stanje izstopa. Če niso navedeni nobeni argumenti, počakaj -n
čaka, da se opravilo v ozadju dokonča in vrne status izhoda iz opravila.
čakanje -n 45432 54346 76573
V zgornjem primeru, počakaj -n
natisne samo status vrnitve opravila, ki najprej zapusti; ne prikazuje PID opravila. Če želite dobiti pid opravila ali Jobspec, za katerega je vrnjeno stanje izstopa, uporabite -str
možnost dodelitve spremenljivki:
počakajte -p job_id -n 45432 54346 76573
-str
možnost je bila uvedena v Bashu 5.1. Če uporabljate starejšo različico Bash, se prikaže napaka »neveljavna možnost«.
The -f
možnost pove počakaj
počakati, da se vsak pid ali Jobspec dejansko konča, preden vrne svojo izhodno kodo, namesto da se vrne, ko se spremeni status opravila. Ta možnost velja samo, če je omogočen nadzor nad opravili. Privzeto je nadzor nad opravili omogočen samo za interaktivne pozive.
Primeri #
počakaj
se običajno uporablja v skriptih lupine, ki ustvarjajo podrejene procese, ki se izvajajo vzporedno.
Za ponazoritev delovanja ukaza ustvarite naslednji skript:
#!/ bin / bash sleep 30 & process_id = $! echo "PID: $ process_id" wait $ process_id echo "Stanje izhoda: $?"
Razložimo kodo vrstico za vrstico:
- Prva vrstica se imenuje shebang in operacijskemu sistemu pove, kateri tolmač naj uporabi za razčlenitev preostale datoteke.
- Uporabljamo
spanje
ukaz za posnemanje zamudnega procesa v ozadju. $!
je notranja spremenljivka Bash, ki v ozadju shrani PID zadnjega opravljenega opravila. V tem primeru je to PID datotekespanje
ukaz. PID shranjujemo v spremenljivko (process_id
).- Natisne številko PID.
- PID se posreduje
počakaj
ukaz, ki čaka dospanje
ukaz zaključi. - Natisne stanje izhoda
počakaj
ukaz.$?
je notranja spremenljivka Bash, ki vsebuje stanje izhoda zadnjega izvršenega ukaza.
Če zaženete skript, bo natisnil nekaj takega:
PID: 36353 Stanje izhoda: 0
Tu je primer uporabe -n
možnost:
#!/ bin / bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "Prvo opravilo je končano."wait echo" Vsa opravila dokončana."
Ko se skript izvede, ustvari 3 procese v ozadju. počakaj -n
počaka, da se prvo opravilo zaključi in se odtisni odmev. počakaj
čaka, da se dokončajo vsa opravila za otroke v ozadju.
prvo opravljeno delo vse opravljene zaposlitve
Zadnji primer pojasnjuje -f
možnost. Odprite terminal in zaženite:
spanje 3600 &
[1] 46671
Počakajte na postopek:
počakaj 46671
Odprite drug terminal in zaustavite postopek z ubiti
ukaz:
ubiti -STOP 46671
Ko se status procesa spremeni, se počakaj
ukaz bo dokončal in vrnil izhodno kodo procesa.
Zdaj ponovite iste korake, vendar tokrat uporabite počakaj -f $ pid
:
spanje 3600 &
počakajte -f 46671
Ustavite postopek z drugega terminala:
ubiti -STOP 46671
Tokrat počakaj
ukaz ne bo dokončan. Potekal bo do spanje
postopek zaključi.
Zaključek #
The počakaj
ukaz čaka, da se navedena opravila dokončajo, in vrne izhodno kodo opravila.
Če imate kakršna koli vprašanja ali povratne informacije, vas prosimo, da pustite komentar.