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

Unix脚本在Java Process Runtime.exec()中不工作,java,linux,unix,tomcat,Java,Linux,Unix,Tomcat,我正在用SpringWebMVC开发一个应用程序,在这里我需要执行一些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.getInp

我正在用SpringWebMVC开发一个应用程序,在这里我需要执行一些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脚本,但我得到了相同的结果

有人能告诉我,这是什么原因吗


提前感谢。

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


在任何情况下,您都肯定希望读取错误流。现在这样做将帮助您诊断此时出现的问题。

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


在任何情况下,您都肯定希望读取错误流。现在这样做将帮助您诊断此时出现的问题。

我假设运行Tomcat的用户对sudo有无限制的访问权限?而且没有提示输入密码?

我假设运行Tomcat的用户对sudo有无限制的访问权限?并且没有提示输入密码?

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

以下是一些您可以尝试查找问题的方法:

  • 尝试在不使用“sudo”的情况下运行“cp”命令

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

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


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

以下是一些您可以尝试查找问题的方法:

  • 尝试在不使用“sudo”的情况下运行“cp”命令

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

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


假设您可以从命令行运行命令,并以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应该是有帮助的。e、 g.运行这个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

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

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应该是有帮助的。e、 g.运行这个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

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

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

在简单的情况下,如“cp/tmp/editinterface.txt/tmp/editinterface1.txt”,它也不起作用。。from.exec()。我不准备相信您正在运行的命令以exit值1退出,并且根本不会将任何内容打印到stdout或stderr。如果你不做所有BufferedReader的工作,直接从InputStream中读取,会发生什么呢?当我直接从proc的InputStream中读取时,它会给我-1。在简单的情况下,比如“cp/tmp/editinterface.txt/tmp/editinterface1.txt”,它也不起作用。。from.exec()。我不准备相信您正在运行的命令以exit值1退出,并且根本不会将任何内容打印到stdout或stderr。如果你不做所有BufferedReader的工作,直接从InputStream中读取,会发生什么?当我直接从proc的InputStream中读取时,它会给我-1。