JP1で困ったこと
JP1をジョブネットワークとして使っているのだが、
JP1からキックされたジョブを起動するユーザの振舞が
その端末のローカルユーザが動かした振舞と異なるときがある。
今回、JP1でキックしているのは、バッチスクリプトだが、
スクリプトの中でpowershellを読んでおり、
こんな処理を実施している。
powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& { get-content -Encoding UTF8 %FILE1% | Set-Content %FILE2%}”
純粋にFILE1を読み込んで、UTF8にエンコーディングしたものをFILE2として出力しているだけなのだが。。。
FILE1の行数が多すぎると、FILE2に追記されず、ロストされる行がでてくる。
ローカルユーザでの単体テストではそんなことは起きないのだが、
JP1からキックされるとこういうが起きる。
原因はつかみ切れていないが、おそらくパイプ(|)でつないでいるので、
その閾値を超えてしまっているのかもしれない。
(後に、これはPowershellのメモリ割当のせいだと発覚。
2GBがデフォルトなので2GBを超えたデータはロストされてしまっているものと思われる。)
解決策として
powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& {Set-Content %TEMPFILENAME% -Value ‘ ‘}
powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& { get-content %1 -ReadCount 10000 -Encoding UTF8 | Add-Content %TEMPFILENAME%}”
上記のような処理に変更し、10000行ずつ読んでは追記するという形に変更したところ、
データロストが起きなくなった。
全ユーザ共通なら発見できるようなものの、
JP1のユーザだけダメってのが本当に困る!
JP1に組み込むのなんて、開発のほぼ最後の方なので、
もう動作は担保してある前提だから、本当に迷惑な話だ。