gpt4 book ai didi

Python 通过 ssh 终止进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:19 27 4
gpt4 key购买 nike

我正在尝试通过 ssh 终止进程。现在,当直接终止进程时,请参阅 init 中注释掉的行,进程在远程主机上终止。当然,我不想立即终止,而是在最后终止所有远程进程。

根据 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()

最佳答案

当您使用 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,那么这些事情都不会发生,进程可以无限期地继续运行。

关于Python 通过 ssh 终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44589688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com