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

41

Comment 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"
0wn3r
la source

Réponses:

68

La clé est la commande "wait":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"
Pascal Schmiel
la source
7
Avantage: il ne brûle PAS le temps processeur avec une boucle infinie fonctionnant tout le temps ....;)
Pascal Schmiel
2
L'inconvénient est que vous ne pouvez rien faire d'autre pendant l'attente, par exemple indiquer la progression à l'utilisateur. Seule la solution de Cuonglm vous permet de le faire.
Mark Booth le
3
@Marque Booth Vous pouvez indiquer la progression d'un troisième travail asynchrone. par exemple:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell
32

Avec waitvous 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.'
Mircea Vutcovici
la source
29

Voici une façon de le faire:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0
cuonglm
la source
2
Merci, c'est certainement la seule réponse qui réponde à mon interprétation de la question initiale (et la raison pour laquelle j'ai fini par regarder cette question)
Mark Booth
@cuonglm, quels sont les processus multiples? waitEst probablement plus approprié pour cela?
Nishant
@cuonglm que fait l'option -0 de la commande kill
k_vishwanath
1
@k_vishwanath indique si le processus est toujours en cours d'exécution ou non.
jeudi
0

Vous pouvez exécuter votre processus avec nohup et écrire un script shell pour lire le fichier nohup.out utilisé par nohup pour se connecter.

  nohup command &
Abhishek Anand Amralkar
la source
4
(1) Au risque de couper les cheveux en quatre, nohupn'écrit rien nohup.out; il crée simplement le fichier et y redirige la sortie de la commande. (2) Si la commande ne produit aucun résultat, rien ne sera écrit nohup.out, et cette idée ne va nulle part. (3) Même si la commandsortie en écriture, comment savoir quand elle se termine en surveillant cette sortie?
G-Man dit 'Réintégrez Monica'
@ G-Man peut-être en vérifiant la sortie de lsofpour voir si nohuputilise encore nohup.out, mais je suis d'accord c'est une méthode très poilue.
Alexej Magura
(4) Au moment où commandcommence à courir, nohupest parti. (1) Oui, je répète un chiffre, parce que je répète ce que j'ai dit il y a deux ans: nohupn'écrit rien nohup.out. (5) Oui, vous pouvez écrire un script shell à boucler et à exécuter lsofpour voir s’il nohup.outest toujours ouvert. Mais ce serait une réponse différente. (6) Même si vous faisiez cela, ce ne serait pas fiable. Et si un autre processus ouvrait le nohup.outfichier? Vous voulez vraiment vérifier si ce processus spécifique est nohup.outouvert. (7) Mais, si vous allez faire cela, pourquoi ne pas simplement vérifier si le processus est en cours d'exécution?
G-Man dit 'Réintégrez Monica' le