我正在构建一个 Java 应用程序,它调用系统命令并在将控制权返回给 Java 线程之前执行该命令。我的调试步骤是我制作了一个名为 test.pl 的 perl 脚本,我从 Java 方法调用该脚本,在 Windows 中,我得到预期的输出和返回值 0。在 Linux 中,我没有得到任何输出或错误输出,我得到 136 的返回值。我在网上花费了大量时间试图找出哪里出错了,但正如我所说,它在 Windows 上运行。我认为这一定是一个我没有发现的简单错误。
这是从http://www.javaworld.com/jw-12-2000/jw-1229-traps.html上优秀的 Runtime.exec() 教程中派生的代码
try {
FileOutputStream fos = new FileOutputStream("output/" + this.startPosition + ".txt");
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(new String[]{"perl", "/data/stat-positive-selection/thaddeus/treesim/chr2YRI/test.pl"});
//System.out.println(commandLine);
// any error message?
StreamGobbler errorGobbler = new
StreamGobbler(proc.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new
StreamGobbler(proc.getInputStream(), "OUTPUT", fos);
// kick them off
errorGobbler.start();
outputGobbler.start();
// any error???
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);
fos.flush();
fos.close();
} catch (Throwable e){
e.printStackTrace();
}
}
我已经弄清楚并修复了代码
new exec call, the use of the shell and the path to perl are required
Process proc = rt.exec(new String[]{"/bin/bash", "-c", "/usr/bin/perl /data/stat-positive-selection/thaddeus/treesim/chr2YRI/test.pl"});