【发布时间】:2018-05-08 04:41:10
【问题描述】:
如何将Ctrl-C 发送到Popen() 对象中的多个ssh -t 进程?
我有一些 Python 代码可以在远程主机上启动脚本:
# kickoff.py
# i call 'ssh' w/ the '-t' flag so that when i press 'ctrl-c', it get's
# sent to the script on the remote host. otherwise 'ctrol-c' would just
# kill things on this end, and the script would still be running on the
# remote server
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
a.communicate()
效果很好,但我需要在远程主机上启动多个脚本:
# kickoff.py
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
b = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'b'])
a.communicate()
b.communicate()
这样做的结果是Ctrl-C 并不能可靠地杀死所有东西,而且我的终端之后总是会出现乱码(我必须运行“重置”)。那么当主脚本被杀死时,我怎样才能杀死两个远程脚本呢?
注意:我试图避免登录远程主机,在进程列表中搜索“script.sh”,并向两个进程发送 SIGINT。我只想能够在启动脚本上按Ctrl-C,并让它杀死两个远程进程。一个不太理想的解决方案可能涉及确定性地查找远程脚本的 PID,但我不知道如何在我当前的设置中做到这一点。
更新:在远程服务器上启动的脚本实际上启动了几个子进程,并且在杀死 ssh 时确实杀死了原始远程脚本(可能是 SIGHUP 的 b/c),子任务没有被杀死.
【问题讨论】:
-
我将标题更改为实际描述您想要做的事情。
-
不知道它是否会起作用,但是您是否尝试过将文本字节“\x03”的结尾发送到子进程?这相当于 Ctrl-C。
-
@Thomas K:好主意,但不幸的是,只有将“\x03”发送到进程所连接的终端的输入端(或者当然,如果程序解释数据那样!)......遗憾的是,在这种情况下,子进程是通过管道而不是终端,所以将 Ctrl-C 转换为 SIGINT 的处理不存在:(
-
什么远程程序让终端乱码?
-
当我说“我的终端出现乱码”时,我的意思是它停止输出 '\r' 字符并且它不会回显我输入的内容。一旦我运行“重置”,它就会恢复正常。