Продолжайте выполнение программы, требующей X-сервера после выхода из сеанса ssh

У меня есть скрипт 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, хотя графический объект просто сохраняется на диске.

Если проблема связана с matplotlib (т. Е. Ваш сценарий никогда не дает ответа, если вы остаетесь на связи, или он работает, потому что ssh перенаправляет ваше соединение Xwindow), вы должны вставить свой файл matplotlibrc:

 backend : AGG 

Таким образом, скрипту не нужно работать Xwindow.

Вместо IO/redirecting используйте screen command tmux или screen command для мониторинга сеанса.

Могу ли я смиренно предложить вам отбросить часть time.sleep() из вашего скрипта и использовать либо cron либо at для периодических и / или задержанных вызовов?

Это упрощает ваш код, безопасно удаляет зависимости от сеанса сеанса ssh и отделяет проблемы генерации и планирования изображений.

Что касается умирающего сценария: я подозреваю, что сценарий после nohup может не иметь права на запись в файл журнала, либо потому, что ему не хватает права на запись в каталог, где вы его запускаете, либо потому, что существующий файл журнала принадлежит, например, root и, следовательно, недоступен ,

Я не знаю, следует ли отказаться от работы, а затем попытаться вызвать bg против нее. Я всегда делаю обратное: foo & disown %1 ; он работает именно в таких обстоятельствах, как ваш.

Попробуйте перенаправить STDIN. Возможно, скрипт читает из stdin, поэтому, когда вы закрываете оболочку, stdin уходит, и он умирает.

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