2017-08-06 11 views
0

私は、ProcessBuilderとRuntime.execの両方を使ってsudoの呼び出されたコマンドに問題があります。私は、ProcessBuilderをより良いソリューションが全体的にあると考えていますが、どちらも同じ結果を生成 - 彼らはシェルがUbuntuの上に微細なコマンドを実行するが、私は、例えばsudoの-i mysqlコマンドを実行しようとしますJavaとsudoのコマンドの実行

public static void runProcess(String[] process) { 
     String s = null; 
     try { 
      Process p = new ProcessBuilder(process).start(); 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
      while ((s = stdInput.readLine()) != null) { System.out.println(s); } 
      while ((s = stdError.readLine()) != null) { System.out.println(s); } 
     } catch (IOException e) { e.printStackTrace(); } 
    } 

これらの2つのコマンド作品:

 String[] cmdArgs0 = { "sudo", "echo", "Done" }; 
     runProcess(cmdArgs0); 

     String[] cmdArgs1 = { "bash", usbDrivePath+"/ASWebUI/Install.sh" }; 
     runProcess(cmdArgs1); 

しかし、これにはない:

 String[] cmdArgs2 = { "sudo", "-i", "mysqldump", "Core", ">", cachePath+"/SQLDumps/Core.sql" }; 
     runProcess(cmdArgs2); 

エラー:

mesg: ttyname failed: Inappropriate ioctl for device 
mysqldump: Couldn't find table: ">" 

答えて

1

ProcessBuilderでは、>文字を使用して出力をリダイレクトすることはできません。代わりにprocessBuilder.redirectOutput()メソッドを使用して、目的の出力を指定することができます。

File dumpFile = new File("Core.sql"); 
processBuilder.redirectOutput(Redirect.to(dumpFile)); 

、あるいはダンプ・ファイルを指定するのmysqldumpの--result-fileオプションを使用します。

mysqldump [options] --result-file=dump.sql 
+0

感謝を!それはうまくいった。 – user3260912

+0

@ user3260912喜んで助けてください!最後の編集を確認してください。Redirect.appendTo(dumpFile)をRedirect.to(dumpFile)に変更しました。最初のものは '>'の代わりに '>>'に対応しています。 –

関連する問題