java プログラムで、centOS マシンで使用する sh スクリプトを生成しています。これは sox と lame を使用して MP3 オーディオ ファイルをデコードし、それぞれファイルにゲインを適用します。Process.waitFor() メソッドが無期限にハングする以外のことを行うのに問題があります。コードは次のとおりです。
try
{
// TODO code application logic here
String reviewPath = "/SomeDirectory/";
String fileName = "FileName";
String extension = ".mp3";
StringBuilder sb = new StringBuilder();
sb.append("#!/bin/bash\n");
sb.append("cd " + reviewPath + "\n");
sb.append("lame --decode " + fileName + extension + "\n");
File script = new File(reviewPath + fileName + ".sh");
script.createNewFile();
script.setExecutable(true);
FileWriter writer = new FileWriter(script);
writer.write(sb.toString());
writer.close();
Process p = Runtime.getRuntime().exec(script.getAbsolutePath());
String line;
BufferedReader bri = new BufferedReader
(new InputStreamReader(p.getInputStream()));
BufferedReader bre = new BufferedReader
(new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
System.out.println(line);
}
bri.close();
while ((line = bre.readLine()) != null) {
System.out.println(line);
}
bre.close();
p.waitFor();
System.out.println("Done.");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
奇妙な点は、手動で生成した .sh ファイルを実行すると、正常に実行および終了しますが、Java のプロセス オブジェクトから実行すると、決して終了しないことです。プロセスの exitValue は常に「プロセスは終了していません」です。set -e をスクリプトに追加して、スクリプトの最後まで終了しようとしました。kill コマンドを使用しないと (ここで実行できるとは思いません)、ここで何が起こっているのか途方に暮れています。助言がありますか?