2016-11-23 269 views
0

我想在远程机器上运行一个进程,并希望在我的主机程序退出时终止进程。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) 

回答

1

当SSH连接被关闭,它会不会杀远程主机上运行命令。

的最简单的解决方案是:

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

然后,当SSH连接被关闭时,PTY(远程主机上)也将被关闭,并且内核(远程主机上)将SIGHUP信号发送到所述远程命令。默认情况下,SIGHUP将终止该进程,以便远程命令被终止。


按照APUE书:

SIGHUP如果断开由终端检测到的被发送到控制进程(会话领导者)与控制终端相关 接口。

0

尝试closer - 我专门为这类事情编写的库。不使用Paramiko,但也许它会为你工作。