グラスフィッシュ サーバー上の Java サーブレットに送信された JSON ファイルからデータのプロットを生成しようとしています。サーブレットでは、Python スクリプトを呼び出してプロットを実行する bash スクリプトを呼び出そうとしています。
サーバーにログインしてターミナルから実行すると、bash および python スクリプトは正常に動作しますが、サーブレットから呼び出すと動作しません。いくつかのテストの後、matplotlib のインポートが問題の原因であると考えています。Pythonスクリプトからmatplotlibに関連するコードを削除すると、正常に実行されますが、matplotlibコードでは何も起こらず、エラーも発生しません。
以下はサーブレットのコードです。
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("./test.sh "+"122333333.JSON");
try {
proc.waitFor();
} catch (InterruptedException ex) {
Logger.getLogger(FileRetrieve.class.getName()).log(Level.SEVERE, null, ex);
}
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
out.println("\nOUTPUT = " + line);
}
out.print("\nbefore execute6");
try {
if (proc.waitFor() != 0) {
out.println("\nexit value = " + proc.exitValue());
}
} catch (InterruptedException e) {
out.println("\nERROR = " + e);
}
以下は bash スクリプトです。
#! /bin/bash
echo this is a test from script
echo $1
python script1.py $1
echo this is another test from script
以下は、python スクリプトの一部です。
import json
import matplotlib as mpl
import sys
mpl.use('Agg')
import matplotlib.pyplot as plt
filename = sys.argv[-1]
if filename.find('.')==-1:
begin = filename[:filename.find('.')+1]
else:
begin = filename[:filename.find('.')]
json_data=open(filename)
data = json.load(json_data)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlabel('time (ns)')
ax.set_ylabel('acceleration (m/s^2)')
ax.set_title('Acceleration X')
ax.plot(data['aTime'], data['ax'], linewidth=1.0)
ax.grid(True)
fig.savefig(begin+'ax.png')