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

所以现在我有一个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实例,如果我不断提前终止我的脚本。 注意背景&是必要的,因为我想在命令运行时运行其他命令。

我已经尝试了几种方法

  1. 为伪terminal添加“-t -t”选项
  2. 添加下面的行希望将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命令的方式可以工作。