【问题标题】:Runtime.getRuntime().exec strange behaviorRuntime.getRuntime().exec 奇怪的行为
【发布时间】:2013-10-05 00:49:34
【问题描述】:

我正在尝试从 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 不起作用,并且没有任何消息告诉我出了什么问题。

有人可以帮忙吗?

【问题讨论】:

    标签: java linux perl bash runtime.exec


    【解决方案1】:

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

    【讨论】:

    • shell 重定向不起作用让我偏离了方向。实际上调用了 perl 脚本。由于参数周围有双引号,它不会运行。它的行为与 Windows 不同。你的建议是对的。谢谢。
    猜你喜欢
    • 2011-07-31
    • 2020-06-24
    • 2018-02-13
    • 1970-01-01
    • 2011-01-09
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多