我有一个 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
使用tmux
或screen command
用于会话监控。
答案3
我可以谦虚地建议您丢弃time.sleep()
脚本中的部分并使用cron
orat
进行定期和/或延迟调用吗?
这简化了您的代码,安全地消除了对 ssh 会话分离的依赖,并分离了图像生成和调度的问题。
关于脚本死亡:我怀疑之后的脚本nohup
可能没有对日志文件的写访问权限,要么是因为它缺乏对启动它的目录的写访问权限,要么是因为现有的日志文件由 root 拥有,因此无法访问。
我不知道是否放弃工作并且然后试图bg
反对它应该有效。我总是做相反的事情:foo & disown %1
;它在像你这样的情况下完全有效。
答案4
也尝试重定向 STDIN。脚本可能正在从标准输入读取,因此当您关闭 shell 时,标准输入就会消失,然后它就会消失。
script.py </dev/null &>/dev/null &
disown