他のホストに「SSH -X -N」で親によって生まれたすべてのプロセスを殺す
-
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自体がそれらのプロセスを停止するため、通常の終了は問題ではありません。)以下 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'
間違い ?
解決
次のアプローチを試してみます。
- 開始しているこの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
SSHプロセスを終了しますが、これはあまりエレガントではありませんが、現在それを使用しています。jobs -p