0

Spring ベースの Web アプリケーションから mysqldump を呼び出し、出力をファイルに書き込みたいと考えています。サーバー上に作成されたファイルへのダウンロード リンクをユーザーに提供できるようにしたいと考えています。

以下を実行してみました:

Runtime.getRuntime().exec("/usr/bin/mysqldump -u <username> -p<password> <db_name> >" + fileName);
Runtime.getRuntime().exec("mysqldump -u <username> -p<password> db_name >" + fileName);

次のファイル名の値を試しました。

fileName = "mysql.sql";
fileName = "/tmp/mysql.sql";
fileName = servletContext.getRealPath("") + "/mysql.sql";

しかし、コマンドは成功しません。process.exitValue() は、エラー コード 2 または 6 を返します。

  ProcessBuilder pb = new ProcessBuilder("/usr/bin/mysqldump", " -u ", "<username>", " -p<password>", "<db_name>", " > ", fileName);
  pb.redirectErrorStream(true); // equivalent of 2>&1
  Process p = pb.start();
  p.waitFor();

これも役に立ちません。

このようなコマンドを webapp から実行する最善の方法を誰か教えてもらえますか? 出力ファイルはどこに作成する必要がありますか? 上記のコマンドの何が問題になっていますか?

これをさまざまなシステム (Linux、Windows) で実行できるようにする必要があります。webapp はどちらのシステムでも実行されます。必要に応じて、プロパティ ファイルで mysqldump パスを抽象化できます。しかし、どうすればこれを機能させることができますか?

4

1 に答える 1

0

これはおそらくあまり良い考えではありません。これが機能するには、サーブレットが非常に寛容なセキュリティ環境を必要とする可能性があります。検索してみると、これで悩んでいる人がたくさん出てきます。

ランタイム exec が何らかの理由でブロックされ、サーブレットがタイムアウトする可能性がある場合でも、その影響はわかりませんが、私には良く聞こえません。

数年前に私が働いていて、リクエストをキューに入れ、機会があればそれらを実行し、ハング、クラッシュ、再起動などを処理する単純なマルチスレッドサーバーを作成したときに、同様の問題がありました。jsvc デーモンとして実行されました。サーブレットは、ソケットを介してメッセージを送信しました。

于 2013-01-09T01:05:15.017 に答える