他のホストに「SSH -X -N」で親によって生まれたすべてのプロセスを殺す

StackOverflow https://stackoverflow.com/questions/4057758

  •  27-09-2019
  •  | 
  •  

質問

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

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

ただし、マスターノードがこのプロセスを殺すと、他のノードの対応する子プロセス、つまりCompute-0-127は死ぬことはありませんが、バックグラウンドで実行され続けます。今、私はこれらの孤立したリンダプロセスを持っている各ノードに手動で行き、それらを殺します kill. 。そのような子供のプロセスを殺す方法はありますか?

プロセスを殺す前にPSTREEのパスペビン1を見てください。
Pastebin1- http://pastebin.com/ynxfr28v
Pastebin2 -http:// pastebin.com/apwxrueh
- ハイパーリンク2番目のパスペビンに十分な評判ポイントではありません、ごめんなさい!(
Answer1に更新します
説明してくれたマーティンに感謝します。フォローしてみました

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

しかし、トルク/マウイ(ジョブの実行を処理する)が仕事(このスクリプト)を殺すとき qdel $jobid プロセスはG09 ASによって開始されました ssh -x $host -n それでも背景で実行されます。ここで何が間違っているのですか? (G09自体がそれらのプロセスを停止するため、通常の終了は問題ではありません。)以下 pstreeqdel

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' 間違い ?

役に立ちましたか?

解決

次のアプローチを試してみます。

  • 開始しているこのG09バイナリをラップするスクリプト/アプリケーションを作成し、代わりにそのラッパーを開始します
  • スクリプトでは、HUP信号が到着するのを待ちます(SSH接続が閉じられたときに受信する必要があります)
  • HUP信号を処理する際に、グループ内のすべてのプロセスを殺すプロセスグループ(IE PID 0)に信号を送信します。

プロセスグループにキル信号を送信するのは本当に簡単です: 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

必要なだけの子どものプロセスを(直接的または間接的に)持つことができます。彼らはすべて信号を取得します - プロセスグループから自分自身を切り離さない限り。

他のヒント

同様の問題がありました ssh -N (に似ている ssh -n)、 と kill -9 0 SSHコールを開始するスクリプト内で実行しても、私のためには機能しません。それみつけたよ kill jobs -p SSHプロセスを終了しますが、これはあまりエレガントではありませんが、現在それを使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top