paramiko:自动终止远程启动的进程

时间:2016-11-23 11:03:07

标签: python process paramiko

我想在远程计算机上运行一个进程,我希望它在我的宿主程序退出时终止。

我有一个小的测试脚本,如下所示:

import time
while True:
    print('hello')
    time.sleep(1)

我通过类似这样的脚本在远程计算机上启动此过程:

导入paramiko

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('my_machine', username='root', key_filename='some_key')
_in, _out, _err = ssh.exec_command('python /home/me/loop.py')
time.sleep(5)  # could do something with in/out/err
ssh.close()

但我的问题是,即使我已经关闭了启动SSH连接的Python进程,启动的进程也会继续运行。

当主机进程终止时,有没有办法强制关闭远程会话和远程启动进程?

修改

This question听起来很相似,但没有令人满意的答案。我试图设置keepalive但没有效果:

ssh.get_transport().set_keepalive(1)

2 个答案:

答案 0 :(得分:1)

当SSH连接关闭时,它不会终止远程主机上的运行命令。

最简单的解决方案是:

ssh.exec_command('python /home/me/loop.py', get_pty=True)
# ... do something ...
ssh.close()

然后当SSH连接关闭时,pty(在远程主机上)也将关闭,内核(在远程主机上)将SIGHUP信号发送到远程命令。默认情况下,SIGHUP将终止进程,因此远程命令将被终止。

根据APUE书:

  

SIGHUP 被发送到关联的控制进程(会话负责人)   如果终端检测到断开连接,则使用控制终端   接口

答案 1 :(得分:0)

尝试closer - 我专门为这类事写的一个库。不使用Paramiko,但也许它无论如何都适合你。