- PR -

Runtime#exec()でnkfコマンドに無反応

1
投稿者投稿内容
みけぽん
会議室デビュー日: 2003/12/26
投稿数: 6
投稿日時: 2004-11-26 16:24
こんにちは。Runtime#exec()でのnkfコマンドの実行について
お知恵を借りたくお願いいたします。

Runtime#exec()での外部コマンド実行で、サーブレットから
サーバにアップロードしたファイルに対してnkfコマンドを
実行したところ、コマンドにまったく反応しません。

実行してもエラーなどは発生しないのですが、直接サーバの該当
ディレクトリ(元ファイルと同ディレクトリ)を確認してみても、
変換後ファイルが作成されていません。

他コマンド(同ファイルの名称変更や再起動)は正常に実行され
ます。また、同じnkfコマンドをtelnet上から実行すると正常に
実行され、変換後ファイルができます。

ProcessのgetErrorStream()でエラー出力を取得してみましたが
何も出力されていません。

サーバの環境はApache2、Tomcat5.0.18、JDK1.4.2です。

実際のコードは以下のとおりです。

----------------------------------------------------------
//ここまででファイルのアップロード完了

//アップロードしたファイルの権限変更
 String command_chown = "chown user /dir/upfile.txt";
 Process proc = Runtime.getRuntime().exec(command_chown);
 proc.waitFor();
 //↑までの処理は成功していることを実際のファイルを見て確認

//ファイルをnkf変換
 String command_nkf = "/usr/bin/nkf -e -Lu /dir/upfile.txt > /dir/cnv_upfile.txt";
 proc = Runtime.getRuntime().exec(command_nkf);
 proc.waitFor();

//デバッグ用にエラー出力取得
 InputStream is = proc.getErrorStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 String line;
 while ((line = br.readLine()) != null) {
 line = line+line;
 }
 request.setAttribute("proc_error",line); //取得エラーをセット

//画面表示jspファイルに遷移
//結果はエラーなしで正常に画面に帰る
//request.getAttribute("line")を出力しても何も表示されない
//サーバ上には、権限を変更されたアップロードファイルのみ存在
//試しに権限変更とnkf変換の順番を逆にしてみても改善されず
----------------------------------------------------------

不足している情報がありましたら、ご指摘いただければと思います。
何か思い当たることがありましたら、何でも構いませんので、
よろしくお願いいたします。


[ メッセージ編集済み 編集者: みけぽん 編集日時 2004-11-26 17:01 ]
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-11-26 17:37
引用:

String command_nkf = "/usr/bin/nkf -e -Lu /dir/upfile.txt > /dir/cnv_upfile.txt";



この書き方だと、command_nkfをStringTokenizerで簡単に千切った配列をそのままexec系のシステムコールに渡すような動きになります。

シェルを介さないので、ワイルドカードの展開とか、IOリダイレクションの処理のようなシェルの機能は当然使えません。

sh -c の引数にコマンドを渡すような感じでやると良いと思いますよ。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-26 17:39
シェル内での実行ではありません。
/usr/bin/nkf -e -Lu /dir/upfile.txt > /dir/cnv_upfile.tx
リダイレクト記号 > の処理はされません。
(シェル/コマンドプロンプト)が処理している機能です。

起動プログラム 引数...
の形のみが可能です。

どうしても > なら、
シェル コマンド 引数
の形で動かします、
nkf には入出力ファイルのオプションがありませんか?
オプション O Output to File (DEFAULT 'nkf.out')
------------------
Java なら コード指定で I/O できるが?
あるいは nkf 出力の吸出しと、転記。

[ メッセージ編集済み 編集者: MMX 編集日時 2004-11-26 17:44 ]

[ メッセージ編集済み 編集者: MMX 編集日時 2004-11-26 17:51 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-26 17:47
まずは切りわけのためにサーブレット内からではなくシンプルな Java クラスから実行してみてはいかがでしょうか。
みけぽん
会議室デビュー日: 2003/12/26
投稿数: 6
投稿日時: 2004-11-29 09:58
皆様、返信いただきましてありがとうございます。
投稿者です。返信が遅くなり申し訳ありません。

皆様からご指摘いただきましたことから、自分でも調べてみて、
元々おかしなことをしていることを理解しました。

sh -c の引数にコマンドを渡し、シェルを介してコマンドを実行
してみます。一応、解決後、詳細(といっても、ご指摘いただいた
ことですべてですが)報告させていただきます。

以下追記です。

解決しました。ご指摘のとおり、下記のように修正して、sh -c の
引数にコマンドを渡すことでうまくいきました。

追加したコード
 String[] cmdarray = {"/bin/sh", "-c", command_nkf};
  //シェルを介するよう引数を設定

変更したコード
 //proc = Runtime.getRuntime().exec(command_nkf);
 // ↓ 以下コードに変更
 proc = Runtime.getRuntime().exec(cmdarray);

以上です。

自分ではどのあたりに問題があるのか、まったく思い至りません
でしたので、非常に助かりました。ありがとうございました。



[ メッセージ編集済み 編集者: みけぽん 編集日時 2004-11-29 10:35 ]
1

スキルアップ/キャリアアップ(JOB@IT)