Indítson el egy háttérfolyamatot, és ellenőrizze, hogy mikor fejeződik be

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

  • Ennek előnye: NEM égeti el a CPU-t idő egy végtelen ciklussal, amely folyamatosan fut ….;)
  • Ennek hátránya, hogy ' nem tehet mást, amíg várakozik , például a haladás jelzése a felhasználó számára. Csak a cuonglm ' s megoldás teszi lehetővé ezt.
  • @Mark Booth jelezze a harmadik aszinkron job előrehaladását. pl .: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

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 a nohup.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 a nohup.out címre semmi nem lesz írva, és ez az ötlet sehova sem megy gyorsan. (3) Még ha a command 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 a nohup továbbra is használja-e a nohup.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 a lsof programot, hogy megnézhesd, hogy a nohup.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á a nohup.out fájlt? Tényleg szeretné ellenőrizni, hogy az adott folyamat nohup.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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük