Java 如何在linux上从rest服务执行sh文件
我有一个在linux机器上用java编写的rest服务 我正在使用:Java 如何在linux上从rest服务执行sh文件,java,linux,shell,rest,process,Java,Linux,Shell,Rest,Process,我有一个在linux机器上用java编写的rest服务 我正在使用: p = Runtime.getRuntime().exec(cmmnd); 或 我可以执行像mkdir,touch。。。 但是当我尝试运行sh文件时,什么也没有发生(例如:sudosh/home/mydir/myfile.sh) 这是许可问题吗?如何解决此问题?此处仅文件执行权限是不够的。首先从命令提示符手动运行命令sudo sh/home/mydir/myfile.sh,检查是否工作?您是sodo询问密码吗?您执行命令的w
p = Runtime.getRuntime().exec(cmmnd);
或
我可以执行像mkdir
,touch
。。。
但是当我尝试运行sh文件时,什么也没有发生(例如:sudosh/home/mydir/myfile.sh
)
这是许可问题吗?如何解决此问题?此处仅文件执行权限是不够的。首先从命令提示符手动运行命令
sudo sh/home/mydir/myfile.sh
,检查是否工作?您是sodo
询问密码吗?您执行命令的web服务帐户是否有权作为sudo
执行?还要检查您的web应用程序是否具有对位置的文件访问权限(意味着它是否可以执行cd/home/mydir/
)/home/mydir/myfile.sh
同时在代码中读取输出并检查实际错误是什么
p.getOutputStream();
还可以尝试:-
ProcessBuilder pb = new ProcessBuilder("sudo sh /home/mydir/myfile.sh");
pb.redirectOutput(new File("/new_path/out.txt"));
Process p = pb.start();
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
我个人认为这是个坏主意。我强烈建议不要这样做。这不是REST服务的目的。我完全不同意这种解决方案。Rest服务不打算这样做。Java是一种独立于平台的语言,但该代码只能在Linux上运行。无论如何,请检查yopur文件的执行(X)权限:chmod+X myfile.sh。谢谢,我在该文件上有777。我希望此服务启动或停止另一个服务。您的脚本是否运行过?在脚本的最开始添加一行以创建文件(提供一个绝对路径,以便您知道在哪里查找它),并检查文件是否已创建?此外,如果这是在try/catch中,您能否确保在捕获异常时打印它?谢谢,是的,sudo sh/home/mydir/myfile.sh运行正常,我可以从我的服务运行sudo commnad,我的服务可以访问文件位置。只有在执行sh(sudo sh…)时,我什么也得不到。我尝试获取输出/输入/错误流-没有收到任何消息在命令提示符下运行
sudo sh/home/mydir/myfile.sh时发生了什么?正如我在回答p.getOutputStream()中提到的代码>打印应用程序中的输出。
ProcessBuilder pb = new ProcessBuilder("sudo sh /home/mydir/myfile.sh");
pb.redirectOutput(new File("/new_path/out.txt"));
Process p = pb.start();
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}