Start en baggrundsproces og kontroller, hvornår den slutter

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

  • (1) På risiko for at klippe hår, nohup ' t skriver noget til nohup.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 til nohup.out, og denne idé går ingen steder hurtigt. (3) Selvom command skriver output, hvordan kan du se, hvornår det slutter ved at overvåge det output?
  • @ G- Mand måske ved at kontrollere output fra lsof for at se om nohup stadig bruger nohup.out, men jeg er enig i, at dette er en meget behåret metode.
  • (4) Når 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 til nohup.out. (5) Ja, du kan skrive et shell-script for at løkke og køre lsof for at se, om nohup.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 filen nohup.out? Du vil virkelig gerne kontrollere, om denne specifikke proces var nohup.out åben. (7) Men hvis du vil gøre det, hvorfor ikke bare kontrollere, om processen kører?

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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *