Start een achtergrondproces en controleer wanneer het eindigt

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

  • Voordeel hiervan: het verbrandt GEEN CPU tijd met een oneindige lus die de hele tijd doorgaat ….;)
  • Het nadeel hiervan is dat je ' niets anders kunt doen terwijl je wacht , zoals het aangeven van de voortgang aan de gebruiker. Alleen cuonglm ' s oplossing kunt u dit doen.
  • @Mark Booth U kunt dit doen geven voortgang aan met een derde asynchrone taak. bijv .: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

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 naar nohup.out; het maakt alleen het bestand, en stuurt de uitvoer van het commando ernaar. (2) Als het commando geen ' uitvoer produceert, zal er niets naar nohup.out worden geschreven, en dit idee gaat nergens snel. (3) Zelfs als command 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 of nohup nog steeds nohup.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 naar nohup.out. (5) Ja, je zou een shellscript kunnen schrijven om te herhalen en lsof draaien om te zien of nohup.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 het nohup.out -bestand opende? Je zou echt willen controleren of dit specifieke proces nohup.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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *