【问题标题】:kill all processes spawned by parent with `ssh -x -n` on other hosts在其他主机上使用 `ssh -x -n` 杀死由父进程生成的所有进程
【发布时间】:2010-10-30 07:42:58
【问题描述】:

嗨 一个名为 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
pastebin1 - http://pastebin.com/yNXFR28V
pastebin2 - http://pastebin.com/ApwXrueh
- 没有足够的声望点来超链接第二个 pastebin,对不起!(
更新到 Answer1
感谢马丁的解释。我试过了

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

但是当 Torque/Maui(处理作业执行)以qdel $jobid 终止作业(此脚本)时,由 G09 以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 二进制文件创建的(G09 是用于量子化学模拟的软件)

标签: ssh kill background-process


【解决方案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

您可以拥有任意数量的子进程(直接或间接);他们都会收到信号——只要他们不脱离进程组。

【讨论】:

  • 谢谢,这是非常有建设性和有用的[现在我只需要用代码破译它,errm 不是 bash 脚本专家 :( ] 你能详细说明一下吗?我们使用 Torque-Maui(它是集群/资源管理器)将 HUP 信号发送到调用 G09 二进制文件的脚本。所以我已经有调用 G09 的包装脚本(启动 ssh -x -n 进程的二进制文件)
  • 查看我对如何杀死进程组的编辑。当然,您不必使用 SIGKILL。
  • 谢谢马丁,我已经编辑了我的问题以反映我实施您的解决方案的尝试,但是,它不起作用,您能否查看更新后的问题?
  • 我很困惑。您编写的脚本:它与 pstree 输出有什么关系?特别是 461.norma.iitb 是什么?如果那是脚本,那么它没有执行 kill 也就不足为奇了:它仍在继续运行,因此显然它没有收到 SIGTERM (反过来,这可能并不奇怪,因为您说 SIGHUP 将被发送,而不是SIGTERM)。
  • 补充说明:将一些touch /tmp/foo 动作放入trap函数中,看看它是否被执行。
【解决方案2】:

我在使用ssh -N(类似于ssh -n)时遇到了类似的问题,如果我在启动 ssh 调用的脚本中运行它,kill -9 0 对我不起作用。我发现kill jobs -p 确实终止了 ssh 进程,这不是很优雅,但我目前正在使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多