【问题标题】:Trying to persist process through SSH is failing [closed]尝试通过 SSH 持久化进程失败 [关闭]
【发布时间】:2012-11-24 08:43:40
【问题描述】:

我有一个长时间运行的 python 程序,我试图在远程服务器上运行。

我查看了"How to keep processes running after ending ssh session?"" How to start process via SSH, so it keeps running?""Run a persistent process via ssh" 和其他一些主题,但它们似乎没有帮助。

我尝试使用screen(通过分离包含后台进程的screen)和nohup 运行python 进程,但是在这两种情况下,当我退出ssh 会话时(其中--我不确定这是否重要——使用 X11 转发运行,因为 python 程序正在创建一些图形),ssh 会话挂起。

即使我将stdinstdoutstdout 从/到/dev/null 重定向,ssh 进程也会挂起。 终止 ssh 会话会终止 python 进程。当我终止 ssh 时,远程服务器上打印以下错误消息:g_dbus_connection_real_closed: Remote peer vanished with error: Underlying GIOStream returned 0 bytes on an async read (g-io-error-quark, 0). Exiting.

此外,我实际上不想将stdoutstderr 重定向到/dev/null,因为我想将它们重定向到日志文件。所以我没有尝试将python进程作为守护进程运行。 (也许日志发送到stdout很糟糕,我猜......)

我应该怎么做,这样我才能:(1) 注销后保持进程运行,(2) 将stdout/stderr 重定向到日志文件?

(“有效”的一件事是在后台暂停然后重新运行 ssh 进程 [挂起后],但是如果我想关闭我的计算机怎么办?)

【问题讨论】:

  • 如果您的程序确实需要 X11 服务器,您可以考虑使用 xpra 而不是 screen
  • ssh 挂起,但是您尝试持久化的程序会发生什么情况?
  • 当 ssh 挂起时,什么也没有发生。如果我杀死 ssh(通过 Ctrl-c~.),python 程序也会死掉。我会调查xpra

标签: linux unix ssh gnu-screen


【解决方案1】:

X11 连接确实是问题所在。 Screen 负责保持 stdin/stdout/stderr 连接,它还保护程序免受 HUP 信号的影响。但是,它并没有为它保留一个虚拟 X 服务器来写图形。

所以问题是:你想用图形做什么?如果您的程序确实需要输出它们,您需要设置一个(虚拟)X 服务器,即使在连接丢失后它也可以继续访问。您可以使用 vnc 连接到此虚拟服务器,就像您可以连接到屏幕会话一样。

或者你可以让程序更适合在后台运行,这意味着它不能使用X服务器。在这种情况下,您可能希望输出一些文件,然后当您想查看它们时,您可以使用单独的程序将其转换为图形。

【讨论】:

    【解决方案2】:

    我认为 sshd 为它的连接创建新的会话负责人 bash,所以如果你把你的程序员放在后台并重定向你的 stdout/stderr (>log 2>&1),那么即使你失去了连接,运行 bash 将控制您的程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多