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
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 dansnohup.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 dansnohup.out
, et cette idée ne va nulle part rapidement. (3) Même sicommand
é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 sinohup
utilise toujoursnohup.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 dansnohup.out
. (5) Oui, vous pouvez écrire un script shell pour boucler et exécuterlsof
pour voir sinohup.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 fichiernohup.out
? Vous voulez vraiment vérifier si ce processus spécifique anohup.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
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;