当后台 ssh 会话终止时终止远程进程

当后台 ssh 会话终止时终止远程进程

因此,现在我有一个 bash 脚本,它使用 ssh 在远程计算机上运行命令。运行 bash 脚本的计算机是 Linux 计算机,远程计算机是运行 cygwin 的 Windows 计算机。bash 脚本包含以下几行

#!/bin/bash
ssh -i key.pem user@ip "command1" &
# some other commands here, not included because they're not relevant to question
wait

命令1是一个长期运行的过程。目前,当我在等待完成之前按 Ctrl-C 退出 bash 脚本时,命令1仍在远程计算机上运行。它实际上变得分离且无法控制。我希望它在我按 Ctrl-C 时终止,否则如果我不断过早终止脚本,远程计算机上将充斥着许多 command1 实例。笔记后台 & 是必要的,因为我想在该命令运行时运行其他命令。

我已经尝试了几种方法

  1. 为伪终端添加“-t -t”选项
  2. 添加下面一行,希望将 SIGINT 传递到我的 ssh 会话

    trap 'kill -INT -$$' SIGINT
    

    我还做了 trap 命令的一个变体,获取了子 PID 列表,并反复执行该命令以终止每个 PID。这也没有用。SIGHUP 也不起作用。

到目前为止我得到的唯一方法命令1终止是如果我只运行 ssh 命令

ssh -t -i key.pem user@ip "command1"

无需将其置于后台,然后在同一终端中键入 Ctrl-C。如果我从另一个终端发送 SIGINT 或 SIGHUP,它甚至不起作用。

通过后台 ssh 终止远程命令的正确方法是什么?

笔记仅当远程机器是 cygwin 环境时才会发生这种情况。

答案1

尝试这样的操作:

#!/bin/bash
function killcommand1() {
    ssh -i key.pem user@ip 'kill `cat/tmp/command1_pid`'
}

trap "killcommand1" SIGINT

ssh -i key.pem user@ip 'command1 & echo $! > /tmp/command1_pid' &
# other commands
wait

这对我从一个 Linux 系统转到另一个 Linux 系统很有用,不幸的是我没有可用的 cygwin 安装,但这种发送 kill 命令的方式无论如何都可以工作。

相关内容