所以现在我有一个bsh脚本,它使用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
command1是一个长期运行的过程。 目前,当我在等待完成之前将Ctrl-C从我的bash脚本中取出时, command1仍在远程计算机上运行。 它基本上变得分离和不可控制。 当我按Ctrl-C时,我希望它终止,否则远程机器将散布许多command1实例,如果我不断提前终止我的脚本。 注意背景&是必要的,因为我想在命令运行时运行其他命令。
我已经尝试了几种方法
添加下面的行希望将SIGINT传递给我的SSH会话
trap 'kill -INT -$$' SIGINT
我也做了陷阱命令的变化,我得到了一个PID子列表,并通过它遍历每一个。 那也行不通。 SIGHUP也没有工作。
到目前为止,我得到command1来终止的唯一方法是如果我只是运行ssh命令
ssh -t -i key.pem user@ip "command1"
没有背景,并在同一个terminal键入Ctrl-C。 如果我从其他terminal发送SIGINT或SIGHUP,它甚至不能工作。
通过后台ssh终止远程命令的正确方法是什么?
注意只有当远程机器是cygwin环境时才会发生这种情况。
尝试这样的事情:
#!/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系统到另一个工作,不幸的是我没有可用的cygwin安装,但这种发送kill命令的方式可以工作。