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
waiteste 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,
nohupnu ' 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ăcommandscrie ieșire, cum puteți spune când se termină monitorizând ieșirea? - @ G- Omule poate verificând ieșirea
lsofpentru a vedea dacănohupfoloseș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,nohupa dispărut. (1) Da, repet un număr, pentru că repet ceea ce am spus acum doi ani:nohupnu scrie nimic înnohup.out. (5) Da, ați putea scrie un script de shell care să ruleze și să rulezelsofpentru a vedea dacănohup.outeste î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.outdeschis. (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 $!;