Проблема запуска python / matplotlib в фоновом режиме после завершения сеанса SSH - PullRequest
24 голосов
/ 14 марта 2010

Мне нужно подключиться к VPN, а затем по ssh из дома на рабочий сервер, и я хочу запустить скрипт python в фоновом режиме, а затем выйти из сеанса ssh. Мой скрипт создает несколько графиков гистограмм, используя matplotlib, и пока я держу соединение открытым, все в порядке, но если я выхожу из системы, я получаю сообщение об ошибке в файле журнала, который я создал для скрипта.

 File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 2058, in loglog
    ax = gca()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 582, in gca
    ax =  gcf().gca(**kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/Home/eud/jmcohen/.local/lib/python2.5/lib-tk/Tkinter.py", line 1647, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:10.0"

Я предполагаю, что он не знает, где создавать нужные мне фигуры, так как я закрываю сеанс X11 ssh. Если я вошел в систему во время работы скрипта, я не вижу никаких всплывающих цифр (хотя это потому, что в моем скрипте нет команды show ()), и я подумал, что python использует tkinter для отображения цифр. Я создаю фигуры так:

loglog()
hist(list,x)
ylabel('y')
xlabel('x')
savefig('%s_hist.ps' %source.name)
close()

Скрипт требует некоторого начального ввода, поэтому я запускаю его в фоновом режиме:

python scriptToRun.py << start>& logfile.log&

Есть ли способ обойти это, или мне просто нужно остаться ssh'd в моей машине?

Спасибо.

Ответы [ 4 ]

23 голосов
/ 15 марта 2010

Я полагаю, что вашему бэкэнду matplotlib требуется X11. Посмотрите в своем файле matplotlibrc, чтобы определить, какой у вас по умолчанию (из-за ошибки, я ставлю TkAgg). Для запуска без X11 используйте бэкэнд Agg. Установите его глобально в файле matplotlibrc или в сценарии по сценарию, добавив его в программу python:

import matplotlib
matplotlib.use('Agg')
11 голосов
/ 15 марта 2010

Похоже, что вы работаете в интерактивном режиме по умолчанию, поэтому matplotlib сначала хочет отобразить все на экране, что, конечно, не может.

Попробуйте поставить

ioff()

вверху вашего скрипта, вместе с внесением изменений в бэкэнд.

ссылка: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.ioff

2 голосов
/ 15 марта 2010

Извините, если это глупый ответ, но если вы просто запускаете консольный сеанс, разве «экрана» не будет достаточно? Отрывные сеансы и т. Д.

0 голосов
/ 15 марта 2010

Если вы работаете в операционной системе * nix, проблема в том, что ваш сеанс завершается, и все процессы, требующие сеанса, также завершаются при отключении. Точнее, все ваши процессы отправляются SIGHUP (зависание сигнала). Обработка по умолчанию SITHUP - завершить процесс. Если вы хотите, чтобы ваш скрипт продолжался, он должен игнорировать сигнал. Самый простой способ сделать это, если вы запустите свой скрипт из командной строки и запустите его с помощью команды nohup:

nohup python scriptToRun.py << start>& logfile.log&

nohup обычно отправляет стандартную ошибку out и standard в файл nohup.out в текущем каталоге. Поскольку вы перенаправляете уже, вывод nohup.out не будет создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...