Question

Salut Un logiciel nommé G09 fonctionne en parallèle en utilisant Linda. Il engendre ses processus enfants parallèles sur d'autres noeuds (hôtes) comme

/usr/bin/ssh -x compute-0-127.local -n /usr/local/g09l/g09/linda-exe/l1002.exel ...other_opts...

Cependant, lorsque le nœud maître tue ce processus, le processus d'enfant correspondant sur un autre noeud, à savoir calculer-0-127 ne meurt pas, mais continue à courir en arrière-plan. En ce moment, je vais manuellement à chaque noeud qui a ces processus Linda orphelins et les tuer avec kill. Est-il possible de tuer ces processus enfants?

Regardez pastebin 1 pour pstree avant de tuer le processus et à après parent pastebin 2 pour pstree est tué
pastebin1 - http://pastebin.com/yNXFR28V
pastebin2 - http: // pastebin.com/ApwXrueh
assez -non points de réputation pour hyperlinking deuxième pastebin, désolé! (
Mise à jour du Répondre1
Merci Martin pour expliquer. J'ai essayé suivant

killme() { kill 0 ; } ; #Make calls to prepare for running G09 ; 
g09 < "$g09inp" > "$g09out" &
trap killme 'TERM'
wait

mais lorsque le couple / Maui (qui gère l'exécution du travail) tue le travail (ce script) que qdel $jobid les processus lancés par G09 comme ssh -x $host -n toujours en arrière-plan. Qu'est-ce que je fais mal ici? (Terminaison normale est pas un problème car G09 s'arrête ces processus.) A la suite est pstree avant qdel

bash
|-461.norma.iitb. /opt/torque/mom_priv/jobs/461.norma.iitb.ac.in.SC
|   `-g09
|       `-l1002.exe 1048576000Pd-C-C-addn-H-MO6-fwd-opt.chk
|           `-cLindaLauncher/tmp/viaExecDataN6
|               |-l1002.exel 1048576000Pd-C-C-addn-H-MO6-fwd-opt.ch
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   |-{l1002.exel}
|               |   `-{l1002.exel}
|               |-ssh -x compute-0-149.local -n ...
|               |-ssh -x compute-0-147.local -n ...
|               |-ssh -x compute-0-146.local -n ...
|               |-{cLindaLauncher}
|               `-{cLindaLauncher}
`-pbs_demux

et après qdel-il encore des spectacles

461.norma.iitb. /opt/torque/mom_priv/jobs/461.norma.iitb.ac.in.SC
`-ssh -x -n compute-0-149 rm\040-rf\040/state/partition1/trirag09/461

l1002.exel 1048576000Pd-C-C-addn-H-MO6-fwd-opt.ch
|-{l1002.exel}
|-{l1002.exel}
|-{l1002.exel}
|-{l1002.exel}
|-{l1002.exel}
|-{l1002.exel}
|-{l1002.exel}
`-{l1002.exel}

ssh -x compute-0-149.local -n /usr/local/g09l/g09/linda-exe/l1002.exel

ssh -x compute-0-147.local -n /usr/local/g09l/g09/linda-exe/l1002.exel

ssh -x compute-0-146.local -n /usr/local/g09l/g09/linda-exe/l1002.exel

Qu'est-ce que je fais mal ici? est le mauvais de trap killme 'TERM'?

Était-ce utile?

La solution

Je voudrais essayer l'approche suivante:

  • créer un script / application qui enveloppe ce binaire G09 que vous commencez, et commencer à wrapper que la place
  • dans le script, attendez le signal HUP pour arriver (ce qui devrait être reçu lorsque la connexion ssh est fermé)
  • dans le traitement du signal HUP, envoyer un signal à votre groupe de processus (par exemple PID 0) qui tue tous les processus dans le groupe.

L'envoi d'un signal KILL au groupe de processus est très simple: kill -9 0. Essayez ceci:

#!/bin/sh
./b.sh 1 &
./b.sh 2 &
sleep 10
kill -9 0

où b.sh est

#!/bin/sh
while /bin/true
do
  echo $1
  sleep 1
done

Vous pouvez avoir autant de processus enfants que vous voulez (directement ou indirectement); ils auront tous le signal -. tant qu'ils ne se détachent pas du groupe de processus

Autres conseils

J'ai eu un problème similaire en utilisant ssh -N (similaire à ssh -n), et kill -9 0 ne fonctionne pas pour moi si je le lance dans un script qui initie l'appel ssh. Je trouve que kill jobs -p ne se termine le processus ssh, ce qui est très élégant, mais je me sers qu'à l'heure actuelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top