Hogyan indíthatok el egy folyamatot a háttérben, és ellenőrizhetem, hogy mikor fejeződik be egy bash szkripten belül? Az ötletem egy ilyen szkript:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Válasz
A kulcs a “wait” parancs:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Megjegyzések
Válasz
A következővel: wait
megadhatja a szükséges részletességet:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
válasz
Itt az egyik módja van ennek:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Megjegyzések
- Köszönöm, határozottan ez az egyetlen válasz, amely megválaszolja az eredeti kérdés értelmezését (és azt az okot, amiért végül ezt a kérdést néztem meg)
- @cuonglm, Mi van több folyamat? Valószínűleg a
wait
alkalmas erre? - @cuonglm mit csinál a -0 opció a parancs megölésére
- @k_vishwanath jelenti, hogy folyamat-e még mindig fut, vagy sem.
Válasz
Futtathatja a folyamatot nohup-tal, és shell szkriptet írhat olvasásra nohup.out fájl, amelyet a nohup a naplózáshoz használ.
nohup command &
Megjegyzések
- (1) A a szőrszálak hasadásának kockázata,
nohup
nem ír ' semmit anohup.out
címre; csupán létrehozza a fájlt, és átirányítja hozzá a parancs kimenetét. (2) Ha a parancs nem ' nem hoz létre semmilyen kimenetet, akkor anohup.out
címre semmi nem lesz írva, és ez az ötlet sehova sem megy gyorsan. (3) Még ha acommand
is ír kimenetet, hogyan lehet megmondani, hogy mikor ér véget az a kimenet figyelése? - @ G- Az ember talán a
lsof
kimenetének ellenőrzésével megnézheti, hogy anohup
továbbra is használja-e anohup.out
de egyetértek azzal, hogy ez egy nagyon szőrös módszer. - (4) Mire
command
elkezd futni,nohup
eltűnt. (1) Igen, megismétlem egy számot, mert megismétlem, amit két évvel ezelőtt mondtam:nohup
nem ír semmit a következő címre:nohup.out
. (5) Igen, írhatsz egy shell parancsfájlt a ciklushoz, és futtathatod alsof
programot, hogy megnézhesd, hogy anohup.out
továbbra is nyitva van-e. De ez más válasz lenne. (6) Még akkor is, ha ezt tennéd, megbízhatatlan lenne. Mi lenne, ha valamilyen más folyamat megnyitná anohup.out
fájlt? Tényleg szeretné ellenőrizni, hogy az adott folyamatnohup.out
nyitva volt-e. (7) De ha ezt meg akarja tenni, akkor miért nem csak azt szeretné ellenőrizni, hogy a folyamat fut-e?
Válasz
wait
csak egy gyermek folyamatban működik, ugyanabban a shellben elindítva; végül is ez a shell funkció.
Bármely tetszőleges háttérfolyamathoz PID-vel kell dolgozni. Amit itt senki nem említ, az a kernel PID újrahasznosítása . A modern linuxos rendszerek meglehetősen újrafelhasználhatják a PID-t gyakran a terheléstől függően. A folyamat megbízható azonosításához nem csak PID-re van szükség. Egy egyszerű megközelítés az idő megtakarítása. amikor a folyamat elindult, és rendszeresen hasonlítsa össze a folyamat jelenlegi kezdési idejével. Ha a PID-t újrafeldolgozzák, a kezdési ideje nem lesz azonos.
A folyamat kezdési idejét a 22. mezőben jelentik a / proc / [pid] / stat fájl. Az időt jiffies értékben (legfeljebb 10ms) mérjük, ami elegendő pontosság a folyamatazonosító újrafeldolgozásának felderítésére.
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 $!;