プロが教えるわが家の防犯対策術!

Webアプリにて下記プラグラムを実行(Tomcat上で実行)したところ以下のような例外が
でました。
cd /home/test/geniatagger-3.0.1 ディレクトリに移動するコマンドで失敗しているようですが
Teraterm上で手入力で実行すると実行できます。
何が原因かわかりますでしょうか。

【例外】
java.io.IOException: Cannot run program "cd /home/test/geniatagger-3.0.1": java.io.IOException: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:475)
at java.lang.Runtime.exec(Runtime.java:610)
at java.lang.Runtime.exec(Runtime.java:483)


【実行したプログラム】
String[] command = {"cd /home/test/geniatagger-3.0.1", "./geniatagger", "I had a pen."};
Process process = Runtime.getRuntime().exec(command);
//exec()が非同期実行であるため実行結果が返ってくるまで待つ
int no = process.waitFor();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String str = "";

while (in.ready()) {
str = in.readLine();
System.out.println("segmentate=" + str);
}
in.close();

A 回答 (1件)

http://docs.oracle.com/javase/jp/6/api/java/lang …[])
より、exec(cmdarry,null,null)相当

http://docs.oracle.com/javase/jp/6/api/java/lang …[],%20java.lang.String[],%20java.io.File)
より
> パラメータ:
> cmdarray - 実行するコマンドと引数を含む配列

ということで、
String[] command = {"cd /home/test/geniatagger-3.0.1", "./geniatagger", "I had a pen."};
Process process = Runtime.getRuntime().exec(command);

"cd /home/test/geniatagger-3.0.1" というコマンドを
"./geniatagger", "I had a pen."
の2つの引数で実行したものになります。

"cd"コマンドに"/home/test/geniatagger-3.0.1" を引数にしたものではありません。

普通"cd /home/test/geniatagger-3.0.1"なんてコマンドは無いので、No such file or directoryになるでしょう。


2つのコマンドを一つのプロセスで実行させたいなら、シェルに実行させるようにします。
String[] command = {"sh", "-c","cd /home/test/geniatagger-3.0.1 ; ./geniatagger 'I had a pen.'"};

あるいは、geniataggerが実行できればよい(カレントディレクトリが関係無い)なら、
String[] command = {"/home/test/geniatagger-3.0.1/geniatagger", "I had a pen."};
とフルパスでコマンドを指定すればよいかと
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。さっそく試してみたいと思います。

お礼日時:2013/03/21 11:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!