2

こんにちは G09 という名前のソフトウェアは、Linda を使用して並行して動作します。他のノード (ホスト) で並列の子プロセスを次のように生成します。

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

ただし、マスター ノードがこのプロセスを強制終了すると、他のノードの対応する子プロセス、つまり compute-0-127 は終了せず、バックグラウンドで実行され続けます。現在、これらの孤立した Linda プロセスを持つ各ノードに手動で移動し、kill. そのような子プロセスを強制終了する方法はありますか?

プロセスを強制終了する前に PSTREE の Pastebin 1 を確認し、親が強制終了された後に PSTREE の Pastebin 2 を
確認 ます
。貼り付け
、申し訳ありません !(
Answer1 への更新
説明してくれてありがとう Martin

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

ただし、Torque/Maui (ジョブの実行を処理する) がジョブ (このスクリプト) を強制終了すると、qdel $jobidG09 によって開始されたプロセスがssh -x $host -nバックグラウンドで実行されます。ここで何が間違っていますか?(G09 自体がこれらのプロセスを停止するため、正常終了は問題ありません。pstree)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

そして、qdelそれがまだ表示された後

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

ここで何が間違っていますか?trap killme 'TERM'間違っていますか?

4

2 に答える 2

1

私は次のアプローチを試します:

  • 開始するこの g09 バイナリをラップするスクリプト/アプリケーションを作成し、代わりにそのラッパーを開始します
  • スクリプトで、HUP シグナルが到着するのを待ちます (これは、ssh 接続が閉じられたときに受信されるはずです)。
  • HUP シグナルを処理する際に、グループ内のすべてのプロセスを強制終了するシグナルをプロセス グループ (つまり、PID 0) に送信します。

プロセス グループに KILL シグナルを送信するのは非常に簡単ですkill -9 0。これを試して:

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

b.sh の場所

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

必要な数の子プロセスを (直接的または間接的に) 持つことができます。プロセスグループから自分自身を切り離さない限り、それらはすべてシグナルを受け取ります。

于 2010-10-30T08:04:28.253 に答える
0

ssh -N(に似たssh -n)を使用して同様の問題kill -9 0があり、ssh呼び出しを開始するスクリプト内で実行すると機能しません。あまり洗練されていないsshプロセスを終了させることがわかりましたが、現在それを使用しています。kill jobs -p

于 2011-02-17T14:47:48.723 に答える