2010-10-30 31 views
2

Salut Un logiciel nommé G09 fonctionne en parallèle avec Linda. Il engendre ses processus enfants parallèles sur d'autres noeuds (hôtes) commeTuer tous les processus engendrés par le parent avec `ssh -x -n` sur les autres hôtes

/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 de fonctionner en arrière-plan. En ce moment, je vais manuellement à chaque nœud qui a ces processus Linda orphelins et les tuer avec kill. Y a-t-il un moyen de tuer ces processus de l'enfant?

Regardez pastebin 1 pour pstree avant de tuer le processus et à pastebin 2 pour pstree après parent tué
pastebin1 - http://pastebin.com/yNXFR28V
pastebin2 - http: // pastebin.com/ApwXrueh
assez -non points de réputation pour hyperlinking secondes pastebin, désolé! (
Mise à jour 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 s exécution du travail) tue le travail (ce script) en tant que qdel $jobid les processus démarrés par G09 en tant que ssh -x $host -n sont toujours exécutés 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.) Ci-dessous 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 montre encore

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 

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

+1

Avez-vous écrit ces processus? – ewanm89

+0

non, ils sont créés par des binaires G09 (G09 est un logiciel pour les simulations de chimie quantique) – Prince

Répondre

1

Je voudrais essayer l'approche suivante:

  • créer un script/application qui enveloppe ce binaire G09 que vous commencez, et commencer à cet emballage à la place
  • dans le script, attendez le signal HUP arrive (qui doit être reçu lorsque la connexion ssh est fermée)
  • Lors du traitement du signal HUP, envoyez un signal à votre groupe de processus (c'est-à-dire PID 0) qui tue tous les processus du 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 recevront tous le signal - tant qu'ils ne se détacheront pas du groupe de processus.

+0

Merci c'est très constructif et utile [maintenant je dois seulement le déchiffrer dans les codes, errm pas un expert dans bash scripting :(] Pouvez-vous Nous utilisons Torque-Maui (c'est un gestionnaire de cluster/ressource) qui envoie un signal HUP au script qui appelle le binaire G09, donc j'ai déjà un script wrapper qui appelle G09 (le binaire qui lance le 'ssh -x -n' processus) – Prince

+0

Quelqu'un peut-il élaborer sur le point de balle 3 – Prince

+0

Voir ma modification de la façon de tuer un groupe de processus.Vous n'avez pas besoin d'utiliser SIGKILL, bien sûr –

0

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 l'exécute dans un script qui initie l'appel ssh.Je trouve que kill jobs -p met fin au processus ssh, ce qui n'est pas très élégant, mais je l'utilise actuellement.