我想从我的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。
检查错误处理;您可能在某处吞下了一个异常,因为在/usr/bin
中没有bash
,所以您得到了一个“找不到文件”异常(或类似的异常)。
请改用< code>"/bin/bash"。其他的应该可以。
还要注意,在部署应用程序后,相对路径将不起作用,因为它将与运行Java VM的进程相关,而这不是您所期望的、想要的或可以使用的。使用getRealPath()
询问您的ServletContext
以获取路径
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();
首先,您确定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。让我们只说,关于配置的文档不是很好。 我找到了一些代码,不记得在哪里,让我开始: 但是在配置部分,我得到了以下错误: 我认