我正在尝试通过ssh终止进程。 现在,当直接终止进程时,请参阅 init 中注释掉的行,进程将在远程主机上终止。 当然,我不想立即终止,而是在最后终止所有远程进程。
取决于选项' -t'在subprocess.Popen中,当我尝试在示例结尾的循环中终止时,会出现不同的结果:
如果' -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()
答案 0 :(得分: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,那么这些都不会发生,并且该过程可以无限期地继续运行。