Подтвердить что ты не робот

Проблема с запуском python/matplotlib в фоновом режиме после завершения сеанса ssh

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

 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"

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

ioff()

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

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

Ответ 2

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

import matplotlib
matplotlib.use('Agg')

Ответ 3

Извините, если это глупый ответ, но если вы просто запускаете консольный сеанс, "экрана" недостаточно? Съемные сеансы и т.д.

Ответ 4

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

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

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