我试图从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);
}

在看到脚本不工作后,我添加了redirect to/tmp/userinput.log。但是根本没有创建日志文件。我还添加了日志以确保java代码的这一部分确实得到执行,而且确实得到了执行。我还试图在comString前面添加“/bin/bash”,但没有什么区别。但是,当我从命令行直接在远程服务器上运行cmdString时,它可以正常工作。
现在,当我将cmdString更改为“touch/tmp/userinput.log”时,它会创建空的日志文件。
所以我知道运行了Runtime.getRuntime().exec(cmdString)命令,当在命令行中输入时,cmdString可以工作,而一个简单的“touch”命令可以处理这个设置。但我完全搞不懂为什么调用perl脚本的实际cmdString不起作用,也没有任何消息告诉我出了什么问题。
有人能帮忙吗?

最佳答案

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

09-08 01:23