Runtime.getRuntime()。exec奇怪的行为

时间:2013-10-05 00:49:35

标签: java linux perl bash runtime.exec

我试图从java运行时调用perl脚本。它使用以下代码在我的windows7笔记本电脑上运行良好,

try {
    String cmdString= "c:\\perl64\\bin\\perl.exe c:\\perl64\\eg\\userinput.pl \""+arg1+"\" \""+arg2+"\"";
    Process p = Runtime.getRuntime().exec(cmdString);
} catch(IOException e) {
    System.out.println(e);
}

perl脚本运行并生成我期望的内容(更新数据库)。

当我把整个东西移到远程CentOS服务器上时,它不再起作用了。脚本是相同的,java代码是

try {
    String cmdString= "/opt/lampp/bin/perl /home/support/scripts/userinput.pl \""+arg1+"\" \""+arg2+"\" > /tmp/userinput.log";
    log(cmdString);
    Process p = Runtime.getRuntime().exec(cmdString);
} catch(IOException e) {
    System.out.println(e);
}

在我看到脚本无效后,我添加了重定向到/tmp/userinput.log。但是根本没有创建日志文件。我还添加了日志以确保java代码的这部分确实被执行了,事实确实如此。我还尝试在comString前面添加“/ bin / bash”,它没有什么区别。但是,当我从命令行直接在远程服务器上运行cmdString时,它可以正常工作。

现在,当我将cmdString更改为“touch /tmp/userinput.log”时,它确实会创建空的日志文件。

所以我知道运行Runtime.getRuntime()。exec(cmdString)命令,并且在命令行输入时cmdString工作,并且一个简单的“触摸”命令可用于此设置。但我完全失去了为什么调用perl脚本的实际cmdString不起作用,并且没有任何消息告诉我什么是错误。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,将命令的每个参数分开,并使用需要String[]的exec版本(您不必担心引用问题)。另外,shell重定向不起作用,因为java没有执行shell。