読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

ProcessBuilder注意点

Java Tips

java の process builder と、シェルの仕様に嵌められたとかそういう話。
ことの発端は、シェルで書いたプログラムをどうテストしようかとか考えた所から。
なんせユニットテストしようっても、結果がXMLで出てこないってから、どうにかjunitに乗っけようと考え出した。
で、ProcessBuilder経由でシェル叩けんじゃね?標準出力もキャプチャ出来そうな雰囲気で、んじゃまやってみるかと、、、、

やって分かったのは、逆にデバック出来ないということだ。

標準出力処理でデッドロックする

先ずこいつは、標準出力バッファが小さいと言うのがわかる。1024バイトで、食いつぶすとポップするまで出力待ちに突入する。一種のデッドロックだ。
仕方ないんで標準出力ストリームを引っこ抜いて、ループで引っこ抜こうとした。すると、sleep 入った瞬間にループを抜けて戻ってくる。
シェルの終了を期待してると、終了ステータス引っこ抜く処理で[まだ処理終わってねーよ]と怒られる。
結局、ストリームの読み込みをスレッド化して待機する必要がある。

スクリプトに引数が渡らない

シェルスクリプトに引数が渡らないことだ。第一引数に sh を指定していると、肝心のスクリプト(第二引数)への引数ではなく、sh への引数と認識されているんだろうか?詳しくは不明。
自己起動出来るように実行権限与(chmod +x)えてみたが、単独で動かない。どうにも/bin/shで起動するしかないくさい。


結局テストを全部シェルで書いて、javaから/bin/sh叩くことに、、、、参った。