gpt4 book ai didi

java - 来自java的bash unix processbuilder未运行

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:31 25 4
gpt4 key购买 nike

我想从我的 Java servlet 执行一个简单的 Unix 命令:我需要做的是像这样一个简单的回显写入文件:

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。

最佳答案

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

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();

关于java - 来自java的bash unix processbuilder未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14703271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com