当前位置: 首页 > 知识库问答 >
问题:

来自java的bash unix processbuilder未运行

章誉
2023-03-14

我想从我的Javaservlet执行一个简单的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命令添加了完整路径。

编辑2:bash在路径/usr/bin/bash中,100%确定。

编辑3:添加SSCCE。

共有3个答案

芮化
2023-03-14

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

请改用< code>"/bin/bash"。其他的应该可以。

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

曹建华
2023-03-14
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();
白修谨
2023-03-14

首先,您确定bash绝对位于/usr/bin吗?第二,您可能需要告诉ProcessBuilder在运行进程时应该使用哪个目录作为cwd,否则它将尝试创建myfile。txt,无论是servlet容器的当前目录,通常是您没有写权限的地方。第三,当您从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();
 类似资料:
  • left join 和 inner join的区别 线程池的调用顺序 Spring循环依赖和三级缓存 AOP机制 索引 最左前缀原则的失效 ABCD 有>号 范围查询后会失效 MVCC的实现 可不可以实习

  • 有一个网站有一个按钮,点击该按钮应该有一个bash脚本,该脚本假设卸载一个目录。该按钮调用php脚本,带此函数: 我的问题是:当im在shell中运行命令时: 它很好用。 当我单击按钮时,会出现测试,但它不会运行脚本。如何查看日志?我可以将日志打印到shell吗?我不能,因为它被激活使用html上的按钮 我想这是权限问题?

  • 我在AQMP 1.0的Vertx IO中使用以下Java代码段: 当我运行此代码时,我得到: 2019-08-27 10:28:27,071 WARN(Slf4JLogger.java:151)-激发了一个exceptionCaught()事件,它到达了管道的尾部。这通常意味着管道中的最后一个处理程序没有处理异常。io . netty . channel . channelpipeline exc

  • 1.自我介绍 2.项目介绍、项目负责的模块、项目遇到的问题、解决方案、项目是否上线 3.金额相关问题 4.Treadloca 的理解 应用 5.线程安全相关问题 6.arraylist的原理、是否线程安全、arraylist扩容机制 7.hashmap的理解和数据结构 8.hashmap存取元素的过程 9.创建线程的四种方式、start和run的区别 10.常用的锁 11.数据库的三大范式 12.

  • 问题内容: 有什么方法可以从存储库中获取OpenCV?我应该添加到哪个工件?我发现的每个教程都是从‘14开始的,似乎有所更改- 他们说它尚未在Maven官方存储库中,但我找到了条目: 可悲的是,我得到了错误 当我使用。我可以以一种使我的项目包含它的方式添加该库,而不必手动将其添加到类路径中的方法吗? 问题答案: 这对我有用。 我正在使用以下Maven依赖项

  • 我在注释处理器上使用Velocity Escape工具时遇到了问题。首先,我让注释处理器单独使用velocity工作得很好,所以我知道设置是正确的。当使用带有scape字符的字符串时,我开始在创建的源代码中出现问题。所以我在网上找到了关于EscapeTool的Velocity。让我们只说,关于配置的文档不是很好。 我找到了一些代码,不记得在哪里,让我开始: 但是在配置部分,我得到了以下错误: 我认