2016-11-23 88 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,但也許它會爲你工作。