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
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 ' tilnohup.out
; det bare oppretter filen, og omdirigerer utdataene fra kommandoen til den. (2) Hvis kommandoen ikke ' ikke gir noen utdata, vil ingenting skrives tilnohup.out
, og denne ideen går ingen steder fort. (3) Selv omcommand
skriver utdata, hvordan kan du vite når det slutter ved å overvåke utdataene? - @ G- Mennesket kanskje ved å sjekke utgangen av
lsof
for å se omnohup
fortsatt brukernohup.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 tilnohup.out
. (5) Ja, du kan skrive et skallskript for å løkke og kjørelsof
for å se omnohup.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 åpnetnohup.out
-filen? Du vil virkelig sjekke om denne spesifikke prosessen haddenohup.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
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;