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
waitalkalmas 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,
nohupnem ír ' semmit anohup.outcí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.outcímre semmi nem lesz írva, és ez az ötlet sehova sem megy gyorsan. (3) Még ha acommandis ír kimenetet, hogyan lehet megmondani, hogy mikor ér véget az a kimenet figyelése? - @ G- Az ember talán a
lsofkimenetének ellenőrzésével megnézheti, hogy anohuptovábbra is használja-e anohup.outde egyetértek azzal, hogy ez egy nagyon szőrös módszer. - (4) Mire
commandelkezd futni,nohupeltűnt. (1) Igen, megismétlem egy számot, mert megismétlem, amit két évvel ezelőtt mondtam:nohupnem ír semmit a következő címre:nohup.out. (5) Igen, írhatsz egy shell parancsfájlt a ciklushoz, és futtathatod alsofprogramot, hogy megnézhesd, hogy anohup.outtová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.outfájlt? Tényleg szeretné ellenőrizni, hogy az adott folyamatnohup.outnyitva 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 $!;