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过程,启动过程仍在继续运行。

是否有一种方法可以强制关闭远程会话,并且当主机过程终止时远程启动过程?

编辑

这个问题听起来相似,但是没有令人满意的答案。我试图设置keepalive,但没有效果:

ssh.get_transport().set_keepalive(1)

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

最简单的解决方案是:

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

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


根据顾问书:

sighup 发送到控制过程(Session Leader)关联 如果端子检测到断开连接,则使用控制端子 接口。

尝试closer-我专门为这种事情编写的库。不使用Paramiko,但也许无论如何它都会对您有用。

最新更新