2017-06-16 111 views
1

我想通过ssh终止一个进程。 现在,当直接终止进程时,请参阅init中的注释行,该进程在远程主机上终止。 当然,我不想立即终止,而是终止所有远程进程。Python通过ssh终止一个进程

根据在subprocess.Popen选项“-t”,当我尝试一下例子结束在循环终止不同的结果显示:

如果“-t”是集,过程是不是终止。

如果设置了'-t',过程终止,但我的终端隐藏任何输入,任何输入都会移动输入行。

现在,为什么没有'-t'选项,进程终止在循环?

serverThreads = [] 
serverscripts = [] 
serverscripts.append("script1") 
serverscripts.append("script2") 

class ServerCaller(threading.Thread): 
def __init__(self, script): 
    threading.Thread.__init__(self) 
    self.script = script 
    self.ssh = subprocess.Popen(["ssh", '-t' , username + dataServer, self.script]) 
    #if I terminate here without '-t' the process on the remote Host is terminated 
    #self.term() 
def term(self): 
    self.ssh.terminate() 

for ss in serverscripts: 
    serverThreads.append(ServerCaller(ss)) 

#if I terminate here without '-t' the process on the remote Host is NOT terminated 
#if I terminate here with '-t' the process on the remote Host is terminated, 
#but my terminal is screwed up 
for t in serverThreads: 
    t.term() 
+3

使用面料或paramiko – e4c5

+0

在我看来,这个问题是我对python缺乏了解,并不是说这是不可能的。终止一个子进程.Popen对我来说已经足够了,我只是想明白为什么同一个对象上完全相同的方法不会做同样的事情。 我已经看过paramiko,但它有问题,告诉我它没有找到我的调用可执行文件,但这是另一个问题 – Vuk

+0

它不是Python,它是ssh。编写你自己的ssh接口就像写一个时间解释一样,它会变成flappy,而且有人已经做得更好,那么你可以做得更好。我认为你有它的工作,并有你的答案。 '-t'强制伪tty,这有点像屏幕。我认为可以在tty获得博士学位。 –

回答

0

当使用ssh到在远程系统上调用命令,并使用-t请求TTY远程命令,则远程SSH服务器将分配一个TTY并与TTY启动远程命令作为其控制TTY。

当您使用ssh来调用不带TTY的远程命令时,远程SSH服务器将创建一组管道并使用这些管道启动远程命令作为命令的标准输入,输出和错误。

当您终止本地ssh实例时,会关闭到服务器的SSH连接。发生这种情况时,远程服务器不会显式尝试终止您之前启动的远程进程。远程服务器只是关闭了它与远程进程的连接 - TTY或一组管道。

如果远程进程以TTY启动(因为您指定了-t),则关闭TTY将导致远程进程接收SIGHUP信号。 SIGHUP将导致进程终止,除非进程专门安排捕捉或忽略该信号。

如果远程进程在没有TTY的情况下启动,那么关闭进程的标准输入/输出/错误不会立即生效。该过程将不会收到SIGHUP或其他信号。如果进程试图从标准输入中读取,它将得到一个文件结束条件。如果它试图写入stdout/stderr,它会得到一个SIGPIPE。如果它不访问stdin/stdout/stderr,那么这些事情都不会发生,并且进程可能会无限期地继续运行。

相关问题