Start en bakgrunnsprosess og sjekk når den slutter

Hvordan kan jeg starte en prosess i bakgrunnen og sjekke når den ender i et bash-skript? Tanken min er et skript som dette:

launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED" 

Svar

Nøkkelen er kommandoen «vent»:

#!/bin/bash /my/process & /another/process & wait echo "All processes done!" 

Kommentarer

  • Fordel med dette: den brenner IKKE CPU tid med en uendelig løkke som går hele tiden ….;)
  • Ulempen med dette er at du kan ' ikke gjøre noe annet mens du venter , for eksempel å indikere fremdrift for brukeren. Bare cuonglm ' s løsning lar deg gjøre dette.
  • @Mark Booth Du kan angi fremgang med en tredje asynkron jobb. f.eks: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

Svar

Med wait du kan ha den granulariteten du trenger:

sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited." 

Svar

Her er en måte å gjø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

  • Takk, dette er definitivt det eneste svaret som svarer på min tolkning av det originale spørsmålet (og grunnen til at jeg endte opp med å se på dette spørsmålet)
  • @cuonglm. Hva er det flere prosesser? Sannsynligvis er wait mer egnet for det?
  • @cuonglm hva gjør -0 muligheten til å drepe kommandoen
  • @k_vishwanath den rapporterer om prosessen kjører fortsatt eller ikke.

Svar

Du kan kjøre prosessen din med nohup og skrive skallskript for å lese nohup.out-fil som nohup bruker til å logge.

 nohup command & 

Kommentarer

  • (1) På fare for å splitte hår, nohup skriver ikke ' til nohup.out; det bare oppretter filen, og omdirigerer utdataene fra kommandoen til den. (2) Hvis kommandoen ikke ' ikke gir noen utdata, vil ingenting skrives til nohup.out, og denne ideen går ingen steder fort. (3) Selv om command skriver utdata, hvordan kan du vite når det slutter ved å overvåke utdataene?
  • @ G- Mennesket kanskje ved å sjekke utgangen av lsof for å se om nohup fortsatt bruker nohup.out, men jeg er enig i at dette er en veldig hårete metode.
  • (4) Når command begynner å løpe, nohup er borte. (1) Ja, jeg gjentar et tall, fordi jeg gjentar det jeg sa for to år siden: nohup skriver ikke noe til nohup.out. (5) Ja, du kan skrive et skallskript for å løkke og kjøre lsof for å se om nohup.out fremdeles er åpen. Men det ville være et annet svar. (6) Selv om du gjorde det, ville det være upålitelig. Hva om en annen prosess åpnet nohup.out -filen? Du vil virkelig sjekke om denne spesifikke prosessen hadde nohup.out åpen. (7) Men hvis du skal gjøre det, hvorfor ikke bare sjekke om prosessen kjører?

Svar

wait fungerer bare for en underordnet prosess lansert i samme skall; det er tross alt en skallfunksjon.

For enhver vilkårlig bakgrunnsprosess trenger du å jobbe med PID. Det ingen her nevner er kjernen PID-resirkulering . Moderne linux-systemer kan gjenbruke PID ganske ofte avhengig av belastning. Du trenger mer enn bare PID for å identifisere prosessen pålitelig. En enkel tilnærming er å spare tid når prosessen startet og sammenlign den regelmessig med den nåværende prosessens starttid. Skulle PID resirkuleres, vil ikke starttiden være den samme.

Starttid for prosessen rapporteres som felt 22 i / proc / [pid] / stat fil. Tiden måles i jiffies (maksimalt 10 ms) som gir nok presisjon for å oppdage prosess-ID-resirkulering.

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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *