Hoe kan ik een proces op de achtergrond starten en controleren wanneer het eindigt in een bash-script? Mijn idee is een script als dit:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Antwoord
De sleutel is het “wait” -commando:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Reacties
Antwoord
Met wait
u kunt de granulatie hebben die u nodig heeft:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
Antwoord
Hier is een manier om het te doen:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Reacties
- Bedankt, dit is absoluut het enige antwoord dat mijn interpretatie van de oorspronkelijke vraag beantwoordt (en de reden waarom ik uiteindelijk naar deze vraag keek).
- @cuonglm, Wat zijn er meerdere processen? Waarschijnlijk is
wait
daar meer geschikt voor? - @cuonglm wat doet de -0 optie om het commando te doden
- @k_vishwanath het rapporteert of het proces is nog steeds actief of niet.
Answer
Je kunt je proces met nohup uitvoeren en shellscript schrijven om te lezen nohup.out-bestand dat nohup gebruikt om in te loggen.
nohup command &
Reacties
- (1) Aan de risico om haren te splitsen,
nohup
schrijft niet ' niets naarnohup.out
; het maakt alleen het bestand, en stuurt de uitvoer van het commando ernaar. (2) Als het commando geen ' uitvoer produceert, zal er niets naarnohup.out
worden geschreven, en dit idee gaat nergens snel. (3) Zelfs alscommand
output schrijft, hoe kun je zien wanneer het eindigt door die output te monitoren? - @ G- Man misschien door de uitvoer van
lsof
te controleren om te zien ofnohup
nog steedsnohup.out
gebruikt, maar ik ben het ermee eens dat dit een erg harige methode is. - (4) Tegen de tijd dat
command
begint te lopen,nohup
is verdwenen. (1) Ja, ik herhaal een getal, omdat ik herhaal wat ik twee jaar geleden zei:nohup
schrijft niets naarnohup.out
. (5) Ja, je zou een shellscript kunnen schrijven om te herhalen enlsof
draaien om te zien ofnohup.out
nog open is. Maar dat zou een ander antwoord zijn. (6) Zelfs als u dat zou doen, zou het onbetrouwbaar zijn. Wat als een ander proces hetnohup.out
-bestand opende? Je zou echt willen controleren of dit specifieke procesnohup.out
open had staan. (7) Maar als u dat gaat doen, waarom controleert u dan niet gewoon of het proces actief is?
Antwoord
wait
werkt alleen voor een onderliggend proces dat in dezelfde shell wordt gestart; het is tenslotte een shell-functie.
Voor elk willekeurig achtergrondproces moet je met PID werken. Wat niemand hier noemt is kernel PID-recycling . Moderne Linux-systemen kunnen PID behoorlijk hergebruiken vaak afhankelijk van de belasting. Je hebt meer nodig dan alleen PID om het proces betrouwbaar te identificeren. Een eenvoudige benadering is om tijd te besparen wanneer het proces is gestart en vergelijk het regelmatig met de huidige starttijd van het proces. Mocht de PID worden gerecycled, dan zal de starttijd niet hetzelfde zijn.
De starttijd van het proces wordt gerapporteerd als veld 22 in / proc / [pid] / stat -bestand. De tijd wordt gemeten in jiffies (maximaal 10 ms), wat voldoende precisie om recycling van proces-IDs te detecteren.
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 $!;