java - Runtime.getRuntime().exec 奇怪的行为

标签 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 不起作用,并且没有任何消息告诉我哪里出了问题。

有人可以帮忙吗?

最佳答案

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

关于java - Runtime.getRuntime().exec 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192830/

相关文章:

java - 随机播放方法会导致重复模式吗?

Java socket timeout connection timeout by socket connect, but fine by UNIX ping 工具

c++ - OpenCV : 中缺少三角测量库

perl - 如何使用perl从html网页中提取特定信息

regex - perl - 正则表达式之间的范围

perl - 如何在 Perl 中修改二进制标量的特定部分?

java - HstSiteConfigurer : ComponentManager initialization failed

javascript - java POST 415(不支持的媒体类型)

linux - Linux 内核中类似 mprotect() 的功能

java - jps 进程作为 root 用户不可用