注销 ssh 会话后继续运行需要 X 服务器的程序

注销 ssh 会话后继续运行需要 X 服务器的程序

我有一个 python 脚本,可以定期生成 png 图像,并将其放在可以通过浏览器访问的服务器上。该图像显示了我在服务器上运行的作业的进度。我正在使用 matplotlib 生成图像。

python 脚本在生成每个图像后进入睡眠状态。一小时后,它醒来,生成新图像,然后重新进入睡眠状态。

我通过 ssh 会话启动脚本。当我注销时,脚本被杀死。我已阅读涵盖此问题的其他线程,但建议的解决方案不起作用。即使我使用以下命令运行脚本,该脚本也会在我注销后被终止

nohup script.py &> job-monitor.log &

或者如果我这样运行

script.py
[Ctrl-Z]
disown -h %1
bg 1

奇怪的是,当我注销并重新登录时,脚本不再运行,并且 job-monitor.log 为空。

可能会发生什么情况,如何让脚本在注销后继续运行?

附加信息:我认为问题与我正在使用的绘图库 matplotlib 有关。我认为它可能需要 X 会话来生成 png,即使图形刚刚保存到磁盘。

答案1

如果问题出在 matplotlib 上(也就是说,如果您保持连接,您的脚本永远不会提供答案,或者它可以工作,因为 ssh 转发您的 Xwindow 连接),您必须放入 matplotlibrc 文件:

backend : AGG

这样,脚本就不需要 Xwindow 来工作。

答案2

而不是IO/redirecting使用tmuxscreen command用于会话监控。

答案3

我可以谦虚地建议您丢弃time.sleep()脚本中的部分并使用cronorat进行定期和/或延迟调用吗?

这简化了您的代码,安全地消除了对 ssh 会话分离的依赖,并分离了图像生成和调度的问题。

关于脚本死亡:我怀疑之后的脚本nohup可能没有对日志文件的写访问权限,要么是因为它缺乏对启动它的目录的写访问权限,要么是因为现有的日志文件由 root 拥有,因此无法访问。

我不知道是否放弃工作并且然后试图bg反对它应该有效。我总是做相反的事情:foo & disown %1;它在像你这样的情况下完全有效。

答案4

也尝试重定向 STDIN。脚本可能正在从标准输入读取,因此当您关闭 shell 时,标准输入就会消失,然后它就会消失。

script.py </dev/null &>/dev/null &
disown

相关内容