我正在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脚本,但我得到相同的结果..
有谁可以告诉我,这应该是什么原因?
提前致谢..
答案 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。