前回まとめた、psqlから5つのOSS(gnuplot、Octave、R、pyxplot、Scilab)を起動してグラフを出す件の関連。少し長いので一つの記事にしました。要約するとScilabはいつも、Rは特殊な場合のみ、環境変数TMPが指すテンポラリフォルダにゴミが残ります。たくさん作業した後は適宜掃除するといいかも。

Contents


実行環境

• Windows7 x64 + Cygwin 2.5.1 + ConEmu 150813g
• Cygwinpsql(パッケージpostgresql-client 9.5.3でインストール)
• WindowsScilab 5.5.2、R 3.3.0(他は前回の記事参照)
• Windowsの管理者権限ユーザ


準備 … 空のフォルダを環境変数TMPで指す

psqlを起動して適当なDBに接続したところから始めてます。まず一時的にロケールをCに(WindowsUTF-8が使えずRが警告を出すので、その抑制用)。後は普通に空フォルダを作って環境変数TMPで指し、念のためlsで中身を一覧。
# \setenv LC_CTYPE 'C' 
# \! mkdir r:/tmp
# \setenv TMP 'r:/tmp'
# \! ls $TMP -lt
total 0


テスト … gnuplot、Octave、R、pyxplot、Scilabpsqlから使用

8613まで行ったのと同様です。psqlから外部コマンド実行でグラフを表示(RpyxplotPDF出力)。今回は各コマンドに続いてTMPフォルダに空のファイルを書き込みました。TMPにゴミが残っていたら、ファイルのタイムスタンプから原因のソフトウェアを特定できます。
# \! d:/works/gnuplot/current/bin/gnuplot -e 'plot(1)' -p > $TMP/gnuplot.end
# \! d:/works/octave/current/bin/octave-cli -q --eval 'plot(1); waitfor(gcf); exit' > $TMP/octave.end 
# \! d:/works/r/current/bin/x64/rscript -e 'plot(1)' > $TMP/r.end
# \! echo 'set term pdf; plot(1)' | pyxplot > $TMP/pyxplot.end
# \setenv SCIHOME 'd:/works/scilab/current'
# \! $SCIHOME/bin/Scilex -nb -e 'plot(1); xclick; exit' > $TMP/scilab.end


↓ 実行している様子。Rpyxplotはグラフが出ないので省きました。


結果 … ScilabだけTMPフォルダにゴミが残った

テスト直後のTMPフォルダは ↓ この通り、Scilabが作った2つの一時フォルダが残ってます。SCI_TMP_の方はプロセスIDがファイルに付く形。
# \! ls $TMP -lt
total 1
drwxr-xr-x 1 Administrator None 0 Aug 15 21:00 hsperfdata_Administrator 
drwxr-xr-x 1 Administrator None 0 Aug 15 20:59 SCI_TMP_1364_
-rw-r--r-- 1 Administrator None 0 Aug 15 20:58 scilab.end
-rw-r--r-- 1 Administrator None 0 Aug 15 20:58 pyxplot.end
-rw-r--r-- 1 Administrator None 0 Aug 15 20:58 r.end
-rw-r--r-- 1 Administrator None 1 Aug 15 20:58 octave.end
-rw-r--r-- 1 Administrator None 0 Aug 15 20:55 gnuplot.end


psqlからでなく普通にBashシェルから ↓ を実行しても同じでした。コマンドラインオプション-eexitすると、一時フォルダを後始末してくれない模様。
$ export SCIHOME='d:/works/scilab/current'
$ $SCIHOME/bin/Scilex -nb -e 'plot(1); xclick; exit' 


BashシェルからScilabの対話シェルを起動して終了すると、2つの一時フォルダはきちんと後片付けされる。でもpsqlから対話シェルに入って終了した場合、残念ながら消去されずそのままでした。


Rでゴミが残るのは、グラフを出して強制終了する特殊な場合

810に書いた無理矢理な方法(Rでプロットウィンドウにグラフを出して止める)をすると ↓ psqlから・BashシェルからともにTMPフォルダにゴミが残ります。スクリプトを強制終了するとの同じなので仕方ない。
# \! d:/works/r/current/bin/x64/rscript -e 'x11(); plot(1); scan("stdin")' 


↓ こんな風にファイル1つ(-eオプションで渡したコマンドのスクリプト)、フォルダ1つ(RtmpXXX)が残ります。
# \! ls $TMP -lt
total 2
-rw-r--r-- 1 Administrator None 31 Aug 15 21:10 Rscript10c43b5e1839 
drwxr-xr-x 1 Administrator None  0 Aug 15 21:10 RtmpA5JI8h
drwxr-xr-x 1 Administrator None  0 Aug 15 21:00 hsperfdata_Administrator
drwxr-xr-x 1 Administrator None  0 Aug 15 20:59 SCI_TMP_1364_
-rw-r--r-- 1 Administrator None  0 Aug 15 20:58 scilab.end
-rw-r--r-- 1 Administrator None  0 Aug 15 20:58 pyxplot.end
-rw-r--r-- 1 Administrator None  0 Aug 15 20:58 r.end
-rw-r--r-- 1 Administrator None  1 Aug 15 20:58 octave.end
-rw-r--r-- 1 Administrator None  0 Aug 15 20:55 gnuplot.end


まとめると、一連の方法でTMPフォルダに残るゴミは ↓ これ。サイズは僅かなので気にする必要ないと思いますが、ソフトウェアによる違いも含めて確認してみました。