- PR -

サーブレットからバッチファイルの起動

1
投稿者投稿内容
down
会議室デビュー日: 2005/07/29
投稿数: 5
投稿日時: 2005-07-29 01:48
何時も、このサイトにて勉強させて頂いております。
サーブレットからサーバ上のファイル操作を行うバッチファイルを起動しようとしています。
しかし、バッチファイル内のコマンドがファイル(又はディレクトリ)操作の記述があると、バッチファイルからの応答がなくサーブレットの処理も停止してしまいます。

<環境>
・JDK 1.4.0
・JRUN4(APPサーバ)
・Apach(WEBサーバ)

簡単なサンプルですが、
=============================================
<test.bat>
set ID=%1
set BASEPATH=C:\TEST
cd %BASEPATH%
mkdir .\%ID%

<exe.java>
String[] cmd = {"c:\\test.bat","A"};
Process pro = Runtime.getRuntime().exec(cmd);
System.out.println("バッチ処理終了");
=======================================================

といった感じで、サーブレットである「exe.java」の.exeを呼び出した後にコンソールに処理終了の出力もされず、その後の処理も実行されません。
他のバッチプログラムでも、実行してみたところ、
バッチファイルのコマンドの中に"echo"のみ
=================
<sample.bat>
echo %1

のみでサーブレット上から起動させるとバッチも問題なく起動し、サーブレットの
その後の処理もうまく行きます。
これが、バッチファイル内のコマンドに
"cd" "mkdir" "copy"などファイル操作に関するコマンドが一つでも入ると
バッチ起動時から全く応答がなくなってしまいます。
サーブレット上でこのようなサーバ上のファイル操作を行うバッチファイルは
起動できないのでしょうか?

どなたか、ご教授のほど宜しくお願いいたします。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2005-07-29 04:06
バッチファイル単体での動作は確認しているのでしょうか?
そして、その際確認しているバッチ実行ユーザは Javaから実行されるユーザと同一でしょうか?
down
会議室デビュー日: 2005/07/29
投稿数: 5
投稿日時: 2005-07-29 07:34
早速のご返答、ありがとうございます。

>バッチファイル単体での動作は確認しているのでしょうか?
>そして、その際確認しているバッチ実行ユーザは Javaから実行されるユーザ
>と同一でしょうか?がとうございます。

説明が不足していて申し訳ありません。
バッチファイル単体での動作は確認できています。
また、バッチファイルの実行はサーブレットクラスファイルが置いてある、
APPサーバにターミナルサービスでアクセスして行いました。
結果、バッチファイルとしては、正しく動きました。
また、パスの入力ミス等も考えて、前の例ですと、
<sample.bat>と<test.bat>はまったく同じフォルダに配置しています。
そして、そのフォルダのサーブレットからの参照は、同じプロパティファイル内の
同じパスを参照しています。

クライアントからサーブレットを起動したとき、サーブレットから呼ぶ
バッチファイルがドライブやフォルダの位置を特定出来ていないのでは?
という疑問もあるのですが、それだとバッチファイル自体をどこに配置すれば良いのか
今のところ、判りません。
以下にサーブレットクラスファイルとバッチファイルの配置例を挙げてみます。

***************************************
<サーブレットクラスファイル>
APPサーバ(JRUN4) 
F:\APP\test\default-ear\default-war\WEB-INF\classes\jp\co\XX\\exe.class

<バッチファイル>
APPサーバ(JRUN4)
F:\APP\test\default-ear\default-war\指定フォルダ\test.bat
****************************************

宜しくお願いいたします。
キルシェ
常連さん
会議室デビュー日: 2004/03/25
投稿数: 26
投稿日時: 2005-07-29 13:07
#ちょっと内容が違うような気がしますが。

Unix(Solaris)では問題なかったのですが、Windowsでは
Runtime#execで起動したときに標準出力/標準エラーを吸い出して
あげないと、バッチが動作しないことがありました。(記憶ですが)
確かサーブレットが停止するまでバッチが実行されない、という現象だったと思います。
#echo文すらNGだったような気はしますが・・・

Process#getOutputStreamとProcess#getErrorStreamを読み出してみては
どうでしょうか。

#私は無限ループでInputStreamを吸い出すスレッドを作成して対処しています。
#1つのバッチ起動で1プロセス(=バッチ)+2スレッド(ストリーム監視)が
#追加されるので、リソースを使いすぎる気もしますが、その環境はリソース管理に
#シビアではなかったので


それからバッチファイルの配置は、絶対パスで指定するか、サーブレットコンテナ
からの相対パスかのどちらかになると思います。
#個人的には、WEB資源としての取り回しが良くなるので後者ですが、
#資源種ごとに分けて管理するのであれば絶対パスになると思います。

----
意味不明な箇所があったので、少し修正しました。
なんにせよ解決したので良かったです(^^

[ メッセージ編集済み 編集者: キルシェ 編集日時 2005-07-29 21:07 ]
down
会議室デビュー日: 2005/07/29
投稿数: 5
投稿日時: 2005-07-29 17:55
>キルシェ様

ご教授ありがとうございます。
教えて頂いた通り、Runtime#execで起動した時に、
標準出力/標準エラーを吐き出す処理を
追加した所、無事バッチファイルが正常に起動しました。

バッチファイルの配置についても、相対パスに切り替えて試してみます。
2日間悩んでいた問題が解消されて、本当に嬉しいです。
また、バッチファイルやJavaの入出力に関する事も学習できました。
本当にありがとうございました。
また、何かありましたら、宜しくお願いいたします。
1

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