来自java的bash unix processbuilder未运行

来自java的bash unix processbuilder未运行,java,bash,unix,servlets,processbuilder,Java,Bash,Unix,Servlets,Processbuilder,我想从Java servlet执行一个简单的Unix命令:我需要做的是对文件进行简单的echo写入,如下所示: echo HELLO > myfile.txt 我在servlet中所做的是: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.ser

我想从Java servlet执行一个简单的Unix命令:我需要做的是对文件进行简单的echo写入,如下所示:

echo HELLO > myfile.txt
我在servlet中所做的是:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletAutorecovery extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > ../webapps/test/myfile.txt");
            pb.start();
        } finally { 
        out.close();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
}
我的问题是:这个代码部分没有给我任何错误,但什么也没有发生。在我执行servlet之后,还没有创建文件,当然,其中没有写入任何内容

我做错了什么

EDIT1:为pb命令添加了完整路径

EDIT2:
bash
在路径
/usr/bin/bash
中,100%确定


EDIT3:添加SSCCE。

检查错误处理;您可能在某个地方遇到了异常,因为
/usr/bin
中没有
bash
,所以您得到了一个“未找到文件”异常(或类似异常)

试试
“/bin/bash”
。剩下的应该有用


还请注意,在部署应用程序后,相对路径将不起作用,因为它将与运行Java VM的进程相关,而这不是您所期望、想要或可能使用的。首先,向您的
ServletContext
查询带有
getRealPath()

的路径,您确定bash肯定位于
/usr/bin
?其次,您可能需要告诉ProcessBuilder在运行进程时应该使用哪个目录作为cwd,否则它将尝试在servlet容器的当前目录中创建myfile.txt,通常是在您没有写访问权限的地方。第三,当您从java运行一个进程时,该进程的输出通过进程对象上的输入流传递回java,它不会直接进入标准输出,因此您需要读取流以查看结果

ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > myfile.txt");
pb.directory(...);
pb.redirectErrorStream(true);
Process p = pb.start();
IOUtils.copy(p.getInputStream(), System.out);
p.waitFor();

您希望myfile.txt在哪里?你在哪里寻找?尝试将文件写入您知道的路径。例如/tmp/myfile.txt我实际上是在我的项目文件夹中写的,
。/webapps/test/myfile.txt
。你试过运行时吗?Runtime.getRuntime().exec(“echo HELLO>myfile.txt”);尝试了以下方法:ProcessBuilder pb=newprocessbuilder(“bash”、“-c”、“echo HELLO>myfile.txt”);为了更快地获得更好的帮助,请在
pb.directory(…)
我应该写什么目录中发布一个.Sorry?输出一个,我想
myfile.txt
在哪里?我在使用
IOUtils
时也遇到问题,即使我添加了
import java.lang.Object。。。4) 您还可以将
“echo HELLO>myfile.txt”
分解为单独的参数。5) 我听说,通过Java使用管道时,管道的工作方式不同。@a请转到您希望成为bash进程当前目录的目录,这就是重定向中的相对路径将被解析的目标。IOUtils是Apache commons io的一部分,我使用它作为将输入流复制到输出流的一种方便方式,但如果您愿意,可以手动执行。@AndrewThompson在本例中,不,您确实希望整个echo和重定向作为一个参数,因为它是由
bash
解释的,而不是由Java解释的。如果没有bash,您无法使用
执行重定向,但在Java 7中,您至少可以使用7中添加到ProcessBuilder的新方法将输出直接发送到文件。@IanRoberts如果我使用的是Tomcat呢?这是个问题吗?
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();