Unix脚本在Java Process Runtime.exec()中不起作用

时间:2009-11-14 06:35:51

标签: java linux unix tomcat

我正在Spring Web MVC中开发一个应用程序,我需要执行一些linux脚本..

我正在使用tomcat 5.5版在linux中运行我的项目..

我的代码看起来像这样:

Process proc = runtime.exec("sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt");
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
    System.out.println("\nOUTPUT = " + line);
}
System.out.print("\nbefore execute6");
try {
    if (proc.waitFor() != 0) {
       System.err.println("\nexit value = " + proc.exitValue());
    }
} catch (InterruptedException e) {
       System.err.println("\nERROR = " + e);
}

在这里,我想使用linux脚本将特定文件从一个位置转换到另一个位置。

但是当我执行这部分时,我正在

exit value = 1

作为输出..我也尝试将此脚本放入.sh文件并尝试从Java代码执行该shell脚本,但我得到相同的结果..

有谁可以告诉我,这应该是什么原因?

提前致谢..

5 个答案:

答案 0 :(得分:2)

我猜想sudo期待一个交互式终端,以便要求输入密码。由于没有交互式终端,它会向stderr输出一条错误消息,并以退出代码1退出。您没有读取错误流,因此您将看不到任何可能打印的消息。

在任何情况下,您肯定都希望阅读错误流。现在这样做可以帮助您诊断出现了什么问题。

答案 1 :(得分:1)

我认为运行Tomcat的用户可以无限制地访问sudo?并且没有提示输入密码?

答案 2 :(得分:1)

您的搜索路径可能很奇怪,并且在尝试执行命令时找不到“cp”和“sudo”。

以下是您可以尝试追踪问题的一些事项:

  • 尝试运行不带“sudo”的“cp”命令。

  • 尝试提供命令的完整路径名。这样可以避免搜索路径问题。

  • 默认情况下,“sudo”使用syslog(3)记录失败的命令。查看是否可以在相应的日志文件中找到跟踪。

答案 3 :(得分:1)

假设您可以从命令行运行命令,以tomcat用户身份登录 - 尝试

ProcessBuilder pb = new ProcessBuilder("/usr/bin/sudo", "cp", 
                    "/var/tmp/mailserverfiles/editinterface.txt", 
                    "/etc/sysconfig/network-scripts/editinterface.txt");
pb.redirectErrorStream(true);
Process proc = pb.start();
... rest of code as before

如果仍然失败,请开始调试。 strace应该会有所帮助。例如运行这个shell脚本 从你的java应用程序中,找出/tmp/trace.txt文件中失败的地方:

#!/bin/sh

strace -f sudo cp /var/tmp/mailserverfiles/editinterface.txt /etc/sysconfig/network-scripts/editinterface.txt  >/tmp/trace.txt 2>&1

答案 4 :(得分:1)

虽然没有直接回答您的问题,但以下内容会有所帮助。您需要读取stdout和stderr(以捕获所有进程输出),并执行此并发以防止生成进程的阻塞。有关详细信息,请参阅this answer