Lancer un processus en arrière-plan et vérifier quand il se termine

Comment puis-je lancer un processus en arrière-plan et vérifier quand il se termine dans un script bash? Mon idée est un script comme celui-ci:

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

Answer

La clé est la commande « wait »:

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

Commentaires

  • Avantage de ceci: il ne brûle PAS le CPU temps avec une boucle infinie en cours dexécution tout le temps ….;)
  • Linconvénient est que vous pouvez ' t faire autre chose pendant que vous attendez , comme lindication de la progression à lutilisateur. Seule la cuonglm ' solution vous permet de le faire.
  • @Mark Booth Vous pouvez indiquer la progression dun troisième travail asynchrone. par exemple: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

Réponse

Avec wait vous pouvez avoir la granularité dont vous avez besoin:

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

Réponse

Voici une façon de procéder:

launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0 

Commentaires

  • Merci, cest certainement la seule réponse qui répond à mon interprétation de la question initiale (et la raison pour laquelle jai fini par regarder cette question)
  • @cuonglm, Quels sont les processus multiples? wait est probablement plus approprié pour cela?
  • @cuonglm que fait -0 option pour tuer la commande
  • @k_vishwanath indique si le processus est toujours en cours dexécution ou non.

Réponse

Vous pouvez exécuter votre processus avec nohup et écrire un script shell à lire nohup.out que nohup utilise pour se connecter.

 nohup command & 

Commentaires

  • (1) Au risque de fendre les cheveux, nohup ne ' t écrire quoi que ce soit dans nohup.out; il crée simplement le fichier et y redirige la sortie de la commande. (2) Si la commande ne produit aucune sortie ', rien ne sera écrit dans nohup.out, et cette idée ne va nulle part rapidement. (3) Même si command écrit la sortie, comment savoir quand elle se termine en surveillant cette sortie?
  • @ G- Homme peut-être en vérifiant la sortie de lsof pour voir si nohup utilise toujours nohup.out, mais je suis daccord que cest une méthode très épineuse.
  • (4) Au moment où command commence à fonctionner, nohup est parti. (1) Oui, je répète un nombre, car je répète ce que jai dit il y a deux ans: nohup nécrit rien dans nohup.out. (5) Oui, vous pouvez écrire un script shell pour boucler et exécuter lsof pour voir si nohup.out est toujours ouvert. Mais ce serait une réponse différente. (6) Même si vous faisiez cela, ce ne serait pas fiable. Que faire si un autre processus ouvrait le fichier nohup.out? Vous voulez vraiment vérifier si ce processus spécifique a nohup.out ouvert. (7) Mais, si vous allez faire cela, pourquoi ne pas simplement vérifier si le processus est en cours dexécution?

Réponse

wait ne fonctionne que pour un processus enfant lancé dans le même shell; cest une fonction shell après tout.

Pour tout processus darrière-plan arbitraire, vous devez travailler avec PID. Ce que personne ne mentionne ici, cest le recyclage des PID du noyau. Les systèmes Linux modernes peuvent réutiliser assez PID souvent en fonction de la charge. Vous avez besoin de plus quun simple PID pour identifier de manière fiable le processus. Une approche simple consiste à gagner du temps lorsque le processus a démarré et comparez-le régulièrement avec lheure de début actuelle du processus. Si le PID est recyclé, son heure de début ne sera pas la même.

Lheure de début du processus est indiquée dans le champ 22 dans / proc / [pid] / stat . Le temps est mesuré en jiffies (au plus 10 ms), ce qui précision pour détecter le recyclage des ID de processus.

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *