Rendre linux “Attente de commande” attendre que TOUS les processus enfants
D'attente n'est pas en attente de tous les processus enfants d'arrêter. C'est mon script:
#!/bin/bash
titlename=`echo "$@"|sed 's/\..\{3\}$//'`
screen -X title "$titlename"
/usr/lib/process.bash -verbose $@
wait
bash -c "mail.bash $@"
screen -X title "$titlename.Done"
Je n'ai pas accès à /usr/lib/processus.bash, mais c'est un script qui change souvent, donc je voudrais référence... mais dans le script:
#!/bin/ksh
#lots of random stuff
/usr/lib/runall $path $auto $params > /dev/null 2>&1&
Mon problème est que runall crée un fichier journal... et mail.bash est supposer pour moi un mail ce fichier journal, mais l'attente n'est pas en attente pour runall pour finir, il semble être la seule à être en attente pour processus.bash à la fin. Est-il de toute façon, sans accès à processus.bash, ou en essayant de garder mon propre version à jour de processus.bash, pour rendre l'attente correctement attendre runall à la fin? (Le fichier journal remplace la précédente courir, je ne peux donc pas seulement de vérifier la présence du fichier journal, car il est toujours là)
Grâce,
Dan
ps -ef
après wait
a fini? Qui devrait montrer que les processus en cours d'exécution et le processus qui est un enfant dont les autres processus...Mon script et Processus.bash fin presque instantanément. Le seul processus est runall, qui s'exécute sous aléatoires PID.
OriginalL'auteur Dan | 2010-02-18
Vous devez vous connecter pour publier un commentaire.
Au lieu de laisser le système d'exploitation commencer à
process.bash
, ce qui crée un shell interne est exécuté, exécute toutes les commandes dansprocess.bash
comme s'ils étaient entrés dans notre script shell, et attend dans ce shell interne est exécuté.Il y a quelques mises en garde à cela, mais il devrait fonctionner si vous ne faites pas quelque chose d'inhabituel.
Pour avoir Ctrl-C de tuer les processus en arrière-plan, l'utilisation de piéger et tuer:
pid=$!; trap "kill $pid; wait $pid; exit 0" SIGINT SIGTERM; wait $pid
OriginalL'auteur ephemient
wait
attend pour diriger les enfants; si tous les enfants de spawn de leurs propres enfants, ne pas attendre pour eux.La seule autre façon de faire est d'attendre PID ou jobspec.
OriginalL'auteur Ignacio Vazquez-Abrams
Le principal problème est que parce que
process.bash
a quitté larunall
processus seront orphelins et détenue parinit
(PID 1). Si vous regardez la liste des processusrunall
n'aurez pas de lien visible de votre processus plus depuis l'intermédiaireprocess.bash
script a quitté. Il n'y a pas moyen d'utiliserps --ppid
ou quelque chose de similaire à la recherche de ce "petit-fils" processus une fois qu'il est orphelin.Vous pouvez
wait
sur un PID. Connaissez-vous le PID durunall
processus? Si il n'y a qu'un seul processus, vous pouvez essayer ce qui va attendre que toutes lesrunall
s:OriginalL'auteur John Kugelman
Vous pourriez récupérer le PID du processus pour lequel vous voulez attendre
Et ensuite passer cette PID comme un argument de la commande Attendre
OriginalL'auteur Debugger