因此,现在我有一个 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 实例。笔记后台 & 是必要的,因为我想在该命令运行时运行其他命令。
我已经尝试了几种方法
- 为伪终端添加“-t -t”选项
添加下面一行,希望将 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 命令的方式无论如何都可以工作。