【问题标题】:How to execute sh file from rest service on linux如何在linux上从rest服务执行sh文件
【发布时间】:2018-08-13 03:27:04
【问题描述】:

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

我正在使用:

p = Runtime.getRuntime().exec(cmmnd);

ProcessBuilder pb = new ProcessBuilder(cmmnd).inheritIO();
p = pb.start();

p.waitFor();

我可以执行诸如mkdirtouch 之类的命令... 但是当我尝试运行 sh 文件时没有任何反应(例如:sudo sh /home/mydir/myfile.sh

是权限问题吗?我该如何解决?

【问题讨论】:

  • 就个人而言,我认为这是一个坏主意。我强烈建议不要这样做。这不是 REST 服务的用途。
  • 我完全不同意这种解决方案。休息服务不打算这样做。 Java 是一种独立于平台的语言,但该代码只能在 Linux 上运行。无论如何,检查yopur文件的执行(X)权限:chmod +X myfile.sh。
  • 谢谢,我在那个文件上有 777。
  • 我希望该服务启动或停止另一个服务
  • 你的脚本运行了吗?在脚本的最开始添加一行以创建文件(提供绝对路径,以便您知道在哪里查找它),并检查文件是否已创建?此外,如果这是在 try/catch 中,您能否确保在捕获异常时打印异常?

标签: java linux shell rest process


【解决方案1】:

这里只有文件执行权限是不够的。首先从命令提示符手动运行命令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();
    }

【讨论】:

  • 谢谢,是的 sudo sh /home/mydir/myfile.sh 运行正常,我可以从我的服务运行 sudo commnad,并且我的服务可以访问文件位置。只有在执行 sh (sudo sh ...) 时,我什么也得不到。我尝试获取输出/输入/错误流 - 我没有收到任何消息
  • 在命令提示符下运行sudo sh /home/mydir/myfile.sh 时发生了什么?同样正如我在回答 p.getOutputStream(); 中提到的那样,将输出打印到您的应用程序中。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2016-06-16
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多