Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在linux上从rest服务执行sh文件_Java_Linux_Shell_Rest_Process - Fatal编程技术网

Java 如何在linux上从rest服务执行sh文件

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

我有一个在linux机器上用java编写的rest服务

我正在使用:

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