【问题标题】:Python Terminating a process over sshPython 通过 ssh 终止进程
【发布时间】:2017-06-16 12:50:10
【问题描述】:

我正在尝试通过 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()

【问题讨论】:

  • 使用织物或 paramiko
  • 在我看来这个问题是我对python缺乏了解,而不是不可能。终止 subprocess.Popen 对我来说就足够了,我只是想了解为什么同一个对象上的完全相同的方法不会做同样的事情。我研究了 paramiko,但遇到了问题,告诉我它没有找到我的调用可执行文件,但这是另一个问题
  • 不是python,是ssh。编写自己的 ssh 接口就像编写时间解释一样,它会很脆弱,而且有人已经做得比你做得更好。我认为你有它的工作并有你的答案。 '-t' 强制伪 tty,它的作用有点像屏幕。我认为一个人可以在 tty 获得博士学位。
  • 好吧,我不是在尝试编写自己的 ssh 接口。尽管如此,我还是进一步研究了它,我想我必须切换到 paramiko 并解决我在那里遇到的问题。感谢您的回复

标签: python linux ssh


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2020-05-16
    • 2011-01-12
    • 2012-10-14
    相关资源
    最近更新 更多