Cum pot lansa un proces în fundal și verificați când se termină într-un script bash? Ideea mea este un script de genul acesta:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Răspuns
Cheia este comanda „wait”:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Comentarii
Răspuns
Cu wait
puteți avea granularitatea de care aveți nevoie:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
Răspuns
Iată o modalitate de a face acest lucru:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Comentarii
- Mulțumesc, acesta este cu siguranță singurul răspuns care răspunde la interpretarea mea a întrebării inițiale (și motivul pentru care am ajuns să mă uit la această întrebare)
- @cuonglm, Ce există procese multiple? Probabil
wait
este mai potrivit pentru asta? - @cuonglm ce face opțiunea -0 pentru a ucide comanda
- @k_vishwanath raportează dacă procesul funcționează în continuare sau nu.
Răspuns
Puteți rula procesul cu nohup și puteți scrie script shell pentru a citi fișier nohup.out pe care nohup îl folosește pentru înregistrare.
nohup command &
Comentarii
- (1) La riscul de despicare a firelor de păr,
nohup
nu ' nu scrie nimic înnohup.out
; doar creează fișierul și redirecționează ieșirea comenzii către acesta. (2) Dacă comanda ' nu produce nicio ieșire, nu se va scrie nimic înnohup.out
și această idee nu merge nicăieri rapid. (3) Chiar dacăcommand
scrie ieșire, cum puteți spune când se termină monitorizând ieșirea? - @ G- Omule poate verificând ieșirea
lsof
pentru a vedea dacănohup
folosește încănohup.out
, dar sunt de acord că aceasta este o metodă foarte păroasă. - (4) Până când
command
începe să ruleze,nohup
a dispărut. (1) Da, repet un număr, pentru că repet ceea ce am spus acum doi ani:nohup
nu scrie nimic înnohup.out
. (5) Da, ați putea scrie un script de shell care să ruleze și să rulezelsof
pentru a vedea dacănohup.out
este încă deschis. Dar acesta ar fi un răspuns diferit. (6) Chiar dacă ați face acest lucru, nu ar fi de încredere. Ce se întâmplă dacă un alt proces deschide fișierulnohup.out
? Doriți cu adevărat să verificați dacă acest proces specific a avutnohup.out
deschis. (7) Dar, dacă veți face acest lucru, de ce să nu verificați doar dacă procesul rulează?
Răspuns
wait
funcționează numai pentru un proces copil lansat în același shell; „este o funcție shell până la urmă.
Pentru orice proces de fundal arbitrar trebuie să lucrați cu PID. Ceea ce nimeni nu menționează aici este nucleul PID reciclare . Sistemele moderne Linux pot reutiliza PID destul de mult de multe ori în funcție de încărcare. Aveți nevoie de mai mult decât PID pentru a identifica în mod fiabil procesul. O abordare simplă este de a economisi timp când procesul a început și comparați-l în mod regulat cu ora curentă de începere a procesului. În cazul în care PID va fi reciclat, ora de început nu va fi aceeași.
Ora de început a procesului este raportată ca câmpul 22 din / proc / [pid] / stat . Timpul este măsurat în jiffies (cel mult 10 ms), care oferă suficient precizie pentru a detecta reciclarea ID-ului procesului.
PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;