Hvordan kan jeg starte en proces i baggrunden og kontrollere, når den slutter inden for et bash-script? Min idé er et script som dette:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Svar
Nøglen er kommandoen “vent”:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Kommentarer
- Fordel ved dette: den brænder IKKE CPU tid med en uendelig løkke, der kører hele tiden ….;)
- Ulempen ved dette er, at du kan ' ikke gøre noget andet, mens du venter , såsom at indikere fremskridt for brugeren. Kun cuonglm ' s løsning giver dig mulighed for at gøre dette.
- @Mark Booth Du kan angive fremskridt med et tredje asynkront job. f.eks.
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
Svar
Med wait
du kan have den granularitet, du har brug for:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
Svar
Her er en måde at gøre det på:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Kommentarer
- Tak, dette er bestemt det eneste svar, der besvarer min fortolkning af det originale spørgsmål (og grunden til, at jeg endte med at se på dette spørgsmål)
- @cuonglm, Hvad er der flere processer? Sandsynligvis
wait
er mere egnet til det? - @cuonglm hvad gør -0 mulighed for at dræbe kommando
- @k_vishwanath rapporterer det om proces kører stadig eller ikke.
Svar
Du kan køre din proces med nohup og skrive shell-script, der skal læses nohup.out-fil, som nohup bruger til at logge.
nohup command &
Kommentarer
Svar
wait
fungerer kun til en underordnet proces, der er startet i samme shell; det er trods alt en skalfunktion.
For enhver vilkårlig baggrundsproces skal du arbejde med PID. Det, som ingen her nævner, er kernen PID-genbrug . Moderne linux-systemer kan muligvis genbruge PID ganske ofte afhængigt af belastningen. Du har brug for mere end bare PID for pålideligt at identificere processen. En enkel tilgang er at spare tid når processen startede og sammenlign den regelmæssigt med den aktuelle processtarttid. Skulle PID genbruges, vil starttiden ikke være den samme.
Processens starttid rapporteres som felt 22 i / proc / [pid] / stat fil. Tiden måles i jiffies (højst 10 ms), hvilket giver nok præcision til registrering af proces-id-genbrug.
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
nohup
' t skriver noget tilnohup.out
; det skaber kun filen og omdirigerer output fra kommandoen til den. (2) Hvis kommandoen ikke ' ikke producerer noget output, vil der ikke blive skrevet noget tilnohup.out
, og denne idé går ingen steder hurtigt. (3) Selvomcommand
skriver output, hvordan kan du se, hvornår det slutter ved at overvåge det output?lsof
for at se omnohup
stadig brugernohup.out
, men jeg er enig i, at dette er en meget behåret metode.command
begynder at køre,nohup
er væk. (1) Ja, jeg gentager et tal, fordi jeg gentager det, jeg sagde for to år siden:nohup
skriver ikke noget tilnohup.out
. (5) Ja, du kan skrive et shell-script for at løkke og kørelsof
for at se, omnohup.out
stadig er åben. Men det ville være et andet svar. (6) Selv hvis du gjorde det, ville det være upålideligt. Hvad hvis en anden proces åbnede filennohup.out
? Du vil virkelig gerne kontrollere, om denne specifikke proces varnohup.out
åben. (7) Men hvis du vil gøre det, hvorfor ikke bare kontrollere, om processen kører?