現在、Java からコマンドプロンプト経由で

Oracle のエクスポートツール EXP.exe を起動させるプログラムを作成しているのですが、
最後の proc.waitFor();
のところでプログラムが止まってしまい、
いくら待ってもエクスポートダンプが出来上がりません。

原因、解決策をお持ちの方、回答をお願いします。

■環境

Oracle 9.2
Java 1.4.2.5
Windows 2000

■参照サイト
http://forums.oracle.com/forums/message.jspa?messageID=1179074

■ソース

String[] cmd = new String[8];
cmd[0] = "cmd.exe";
cmd[1] = "/C";
cmd[2] = "START";
cmd[3] = "/wait";
cmd[4] = "exp.exe";
cmd[5] = dbuser + "/" + password + "@" + dbstr;
cmd[6] = "tables=(table1,table2)";
cmd[7] = "file=" + filePath + stamp + dumpFileName;

proc = Runtime.getRuntime().exec(cmd);
proc.waitFor();


よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/09/11 17:54:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント35pt

getOutputStream() を実行していましたのはどの段階ですか?

また、これはプロセスへの入力のはずですが getInputStream() じゃないですか?

以下は確証無く、思いつくままあげてみます。

・exec 時に env (環境変数) や dir (カレントディレクトリ) を指定する。

・exec の後、Thread.sleep() してみる。

・exec の後、proc.getOutputStream().close() してみる。

・exec の後、proc.getInputStream().close() してみる。

直接実行には問題ないようですので、あとはこれぐらいでしょうか。

id:hituziotoko

ご指摘の通り getInputStream() の間違いです。

実行したのは

proc = Runtime.getRuntime().exec(cmd);

proc.waitFor();

の間です。

ちなみにproc.waitFor(); を呼び出さずに

プログラムを終了させると数百KBまでは正常なダンプファイルが作成されますが、

それを超えると5KBぐらい書き込んだ段階で止まってしまいます。

作成されたダンプファイルを除いてみると

...INTERUPTED みたいに書いてあって処理が中断してしまっているように読み取れました。

教えていただいた項目も試して見ます。

2006/09/10 23:09:23

その他の回答1件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント35pt

実際に実行されるコマンドを同じユーザーでコマンドプロンプトから実行してみたらどうなりますか?

あと、exp.exe の log の指定もして見ましょう。何か表示されるかもしれません。

id:hituziotoko

すばやい回答ありがとうございます。

コマンドプロンプトから実行すると、正常にエクスポートが完了します。

logはまだ試していませんが、proc.getOutputStream()から取得した情報では、

EXP ~~file=dumpFileName

と出力されたところで止まっているようです。

log オプションは画面表示される内容をファイルに書き出すだけだと思っているので試していませんでした。

logの指定も試してみます。

2006/09/10 22:22:59
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント35pt

getOutputStream() を実行していましたのはどの段階ですか?

また、これはプロセスへの入力のはずですが getInputStream() じゃないですか?

以下は確証無く、思いつくままあげてみます。

・exec 時に env (環境変数) や dir (カレントディレクトリ) を指定する。

・exec の後、Thread.sleep() してみる。

・exec の後、proc.getOutputStream().close() してみる。

・exec の後、proc.getInputStream().close() してみる。

直接実行には問題ないようですので、あとはこれぐらいでしょうか。

id:hituziotoko

ご指摘の通り getInputStream() の間違いです。

実行したのは

proc = Runtime.getRuntime().exec(cmd);

proc.waitFor();

の間です。

ちなみにproc.waitFor(); を呼び出さずに

プログラムを終了させると数百KBまでは正常なダンプファイルが作成されますが、

それを超えると5KBぐらい書き込んだ段階で止まってしまいます。

作成されたダンプファイルを除いてみると

...INTERUPTED みたいに書いてあって処理が中断してしまっているように読み取れました。

教えていただいた項目も試して見ます。

2006/09/10 23:09:23
  • id:hituziotoko
    公開したソースにはあったのですが、
    配列に"/C"突っ込むのローカルのソースでは
    忘れていたのが原因でした。

    String[] cmd = new String[8];
    cmd[0] = "cmd.exe";
    cmd[1] = "/C";
    cmd[2] = "START";
    cmd[3] = "/WAIT";
    cmd[4] = "EXP.exe";
    cmd[5] = dbuser + "/" + password + "@" + dbstr;
    cmd[6] = "tables=(table1,table2)";
    cmd[7] = "file=" + filePath + stamp + dumpFileName;
    proc = Runtime.getRuntime().exec(cmd);

    上記のコマンドでうまく動きました。

    このソースを実行するとEXPが実行されている間は
    どうしてもEXP.exeの窓が開いてしまう。なぜだー

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません