- - PR -
Runtime#exec()でnkfコマンドに無反応
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2004-11-26 17:37
この書き方だと、command_nkfをStringTokenizerで簡単に千切った配列をそのままexec系のシステムコールに渡すような動きになります。 シェルを介さないので、ワイルドカードの展開とか、IOリダイレクションの処理のようなシェルの機能は当然使えません。 sh -c の引数にコマンドを渡すような感じでやると良いと思いますよ。 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2004-11-26 17:47
まずは切りわけのためにサーブレット内からではなくシンプルな Java クラスから実行してみてはいかがでしょうか。
| ||||
|
投稿日時: 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