web-dev-qa-db-ja.com

sshセッションの終了後にバックグラウンドでpython / matplotlibを実行する際の問題

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接続したままにする必要がありますか?

ありがとう。

25
Jamie

デフォルトではインタラクティブモードで実行しているように見えるので、matplotlibは最初にすべてを画面にプロットしたいのですが、もちろんそれはできません。

入れてみてください

ioff()

スクリプトの上部で、バックエンドを変更します。

参照: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.ioff

11
Vicki Laidler

MatplotlibバックエンドにはX11が必要だと思います。 matplotlibrcファイルを調べて、デフォルトが何であるかを判別します(エラーから、私はTkAggに賭けています)。 X11なしで実行するには、Aggバックエンドを使用します。これをpythonプログラム:]に追加して、matplotlibrcファイルでグローバルに設定するか、スクリプトごとに設定します。

import matplotlib
matplotlib.use('Agg')
23
Mark

これがばかげた答えである場合は申し訳ありませんが、コンソールセッションを実行しているだけの場合は、「画面」では不十分ですか?取り外し可能なセッションなど。

2
Bolster

* nix OSで実行している場合、問題はセッションが終了し、切断するとセッションを必要とするすべてのプロセスも終了することです。より具体的には、すべてのプロセスにSIGHUP(シグナルハングアップ)が送信されます。 SITHUPのデフォルトの処理は、プロセスを終了することです。スクリプトを続行する場合は、信号を無視する必要があります。これを行う最も簡単な方法は、コマンドラインからスクリプトを開始し、Nohupコマンドを使用してスクリプトを実行すると仮定した場合です。

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

Nohupは通常、標準出力と標準エラーを現在のディレクトリのファイルNohup.outに送信します。すでに出力をリダイレクトしているため、Nohup.outは作成されません。

0
Robert Menteer