2

Java Web アプリケーション (Eclipse で Tomcat 8 を使用する Maven プロジェクト) からコマンドを実行しようとしています。このコマンドを cmd ラインまたは .jar ファイルで実行すると問題はありませんが、Eclipse では機能しません。ProcessBuilder私はクラスを試しRuntime.getRuntime().exec()ましたが、両方とも同じ「ファイルが見つかりません例外」例外をスローします。

java.io.IOException: Cannot run program "mongodump": error=2, No such file or directory

実行したいコマンドは次のとおりです。

mongodump --db TweetsDB --collection Tweets --out ./TweetsDB_backup/

ランタイム環境が mongodump コマンド (および/またはコマンドで指定されたフォルダー) を見つけることができないようです。何か提案はありますか? ここに私のコードがあります:

public synchronized static void backup(){
Process p;
try {
    String dateTimeInString = dateTimeToString(Calendar.getInstance());
    System.out.println("backuppando "+dateTimeInString); 
    p = Runtime.getRuntime().exec("mongodump --db TweetsDB --collection Tweets --out ./backup/"); //override always the same db to save space
    p.waitFor();
    System.out.println("Backup effettuato correttamente :)");
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}

これは「プロセス ビルダー」バリアントです。

ProcessBuilder builder = new ProcessBuilder("mongodump", "--db", "TweetsDB","--collection", "Tweets", "--out" ,"./TweetsDB_backup/");
builder.redirectErrorStream(true); // equivalent of 2>&1
final Process process = builder.start();
InputStream es = process.getErrorStream();
InputStreamReader esr = new InputStreamReader(es);
BufferedReader br = new BufferedReader(esr);
String line;
while((line = br.readLine())!= null){
    System.out.println(line);
}

ありがとう、ジュリオ

4

2 に答える 2

0

ProcessBuilder または Runtime.getRuntime().exec() を使用してプロセスを開始すると、開始中のプロセスからの出力が飲み込まれます。

実際の問題を確認するには、その出力を取得する必要があります。

Runtime.exec() では、process.getErrorStream() と process.getInputStream() を使用し、スレッドを設定して出力を見える場所にコピーする必要があります。

ProcessBuilder を使用すると、ProcessBuilder.start() を呼び出す前に、ProcessBuilder.inheritIO() を使用して、結果のプロセスから現在の (親) プロセスに IO を誘導できます。

プロセスの出力をサーバー ログにリダイレクトするために使用ProcessBuilder.inheritIO()すると、エラーの内容がわかる場合があります。

以下を試して、それが役立つかどうかを確認してください。

ProcessBuilder builder = new ProcessBuilder("mongodump", "--db", "TweetsDB","--collection", "Tweets", "--out" ,"./TweetsDB_backup/");
builder.inheritIO(); 
final Process process = builder.start();

エラーが何であるかがわかれば、解決策を見つけることができるかもしれません。

結果として得られるプロセスで、いくつかの追加の環境変数または何かを設定して、それを機能させる必要があると思います。

于 2015-04-14T12:46:46.883 に答える