21951


Javaからmysqlコマンドを実行し、結果をファイルに書き出したいのですがうまく行きません。

実行環境はMacOS 10.11.2です。

[code]

    public class Main {
        public static void main(String[] args) {
            String[] cmd = new String[]{"/bin/sh", "-c", "mysql", "-u", "root", "-ppassword", "databaseName"};
    
            ProcessBuilder builder = new ProcessBuilder(cmd);
            builder.redirectInput(ProcessBuilder.Redirect.from(new File("sample.sql")));
            builder.redirectOutput(new File("result.tsv"));
    
            try {
                Process p = builder.start();
                p.waitFor();
                System.out.println(builder.redirectInput());
            } catch (IOException | InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
[/code]

sample.sql `select * from sample;`

コンソールにredirect to read from file "sample.sql"と出力され、  
result.tsvは空白のまま生成されます。

ターミナルに直接`mysql -u root -ppassword -D sql2xlsx < sample.sql >
result.tsv`と入力した場合は、  
result.tsvにはselectの結果が入力されます。


CC BY-SA 3.0
2016-01-10T23:54:40.513
20814
2016-07-12T14:17:42.333
2016-01-11T00:24:31.583
12251
12251
question
java mysql macos
Javaからmysqlコマンドを実行し、結果をファイルに書き出したい。


まず正常にmysqlを実行できているかを確認するため、`p.waitFor();`の戻り値(int)を取得してください。  
例えばSystem.out.println()を使って出力し、0 でなければ異常終了でしょう。

なお、cmdの配列にて指定しているパスや引数が間違っている場合は、1が戻り値になります。

正しい指定の一例ですが、Windowsであれば

[code]

    String[] cmd = new String[] { "C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysql", "-u", "root", "-ppassword", "test" };
    
[/code]

のようになります。この例では環境変数は使わずに指定していますので、/bin/sh -cで使わずに実行できるかどうかをお試しください。

例えば`/usr/local/mysql/bin/mysql -u root -ppassword test`で実行できるなら、

[code]

    String[] cmd = new String[] { "/usr/local/mysql/bin/mysql", "-u", "root", "-ppassword", "test" };
    
[/code]

で実行できるかと思われます（恐れながら、MacOSでの検証はしておりません）


CC BY-SA 3.0
2016-01-11T09:22:14.490
20829
2016-01-11T09:22:14.490
5778
20814
answer


コメント欄より引用

> /bin/sh: mysql: command not found

`mysql`コマンドが見つからない時に表示されるエラーです。

> p.waitfor();の戻り値は127です。

これも `/bin/sh` が `-c` で指定されたコマンドを見つけられない時に返すコードです。  
ターミナル上で次の実行すると再現すると思います。

[code]

    $ /bin/sh -c mysql -u root -p...
    /bin/sh: mysql: command not found
    
    $ echo $?
    127
    
[/code]

回避するには `mysql` コマンドをフルパスで指定してみてください。

[code]

    $ /usr/local/bin/mysql -u root -p ...
    
[/code]


CC BY-SA 3.0
2016-02-10T15:02:59.980
21951
2016-02-10T15:02:59.980
5008
20814
answer


PATH 変数の設定が分からないので、解決よりはトラブルシューティングの方法ですが、

ターミナルで

[code]

    $ echo $PATH
    
[/code]

の出力と、Java プログラムで

[code]

    String[] cmd = new String[]{ "/bin/sh", "-c", "echo $PATH" };
    
[/code]

を実行した出力を比べてみましょう。`mysql` がインストールされているディレクトリに関して違いがあるはずです。

今、bash の man ページを読み直してみましたが、この問題は ~/.profile の中で PATH をきちんと設定することで解決するでしょう。


CC BY-SA 3.0
2016-05-11T05:07:14.240
24740
2016-05-11T05:07:14.240
15325
20814
answer