0

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

我看过“如何在结束 ssh 会话后保持进程运行?” , " 如何通过 SSH 启动进程,让它继续运行?" , "Run a persistent process via ssh"和其他一些主题,但它们似乎没有帮助。

我已经尝试使用screen(通过分离screen包含后台进程)nohup和,因为 python 程序正在创建一些图形),ssh 会话挂起。

即使我重定向stdin, stdout, stdoutfrom/to ,ssh 进程也会挂起/dev/null。终止 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.

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

我应该怎么做,以便我可以:(1)在注销后保持我的进程运行,(2)重定向stdout/stderr到日志文件?

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

4

2 回答 2

2

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

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

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

于 2012-11-24T08:52:13.523 回答
0

我认为 sshd 为其连接创建新的会话负责人 bash,因此,如果您将程序员置于后台并重定向您的stdout/ stderr( >log 2>&1 ),那么即使您失去连接,正在运行的 bash 也会控制您的程序。

于 2012-11-24T08:49:19.397 回答