【问题标题】:Running a linux service from Java从 Java 运行 linux 服务
【发布时间】:2015-09-18 22:09:46
【问题描述】:

我正在尝试从 Java 启动和停止 linux 服务。我正在按照当前公认的做法使用 ProcessBuilder。我构造了如下代码(webService是一个参数,包含正在启动的服务的名称):

String[] commands = new String[6]; 

commands[0] = "/bin/sh";
commands[1] = "-c";
commands[2] = "sudo";
commands[3] = "service";
commands[4] = webService;
commands[5] = "start";

ProcessBuilder processBuilder = new ProcessBuilder(commands);

Process process = processBuilder.start();

int outcomeOfProcess = process.waitFor();

这实际上是调用命令/bin/sh -c sudo service webService start。从服务器的 linux 终端运行时运行良好,但在 Java ProcessBuilder 中不起作用(运行时结果为 1)。

我也尝试过sudo systemctl start webservice.service,但无济于事 - 我还尝试调用已经位于 linux 机器上的 bash 脚本,但这也不起作用。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你设置无密码sudo了吗?或者你如何提供密码?
  • 尝试使用 sudo 运行你的 java 进程,这样进程将以更高的访问权限运行,并且能够触发像 sudo 这样的管理员命令
  • 哦,那不应该是/bin/sh -c "sudo service webService start",吗?
  • 我删除了我的答案,因为下面的答案正是我所得到的。

标签: java linux


【解决方案1】:

不确定ProcessBuilder 能否处理 SO 请求。对于需要执行主机操作系统命令(Windows/OSX/Linux 等)的情况,我使用Runtime.exec(String):

String command = "/bin/sh -c sudo service " + webService  + " start";
Runtime.getRuntime().exec(command);

如果您还想获得输出和错误退出,您可以使用ProcessBufferedReader 作为described in this answer

public static void main(String args[]) {
    String s;
    Process p;

    String command = "/bin/sh -c sudo service " + webService  + " start";

    try {
        // run the command
        p = Runtime.getRuntime().exec(command);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        // get the result
        while ((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        // get the exit code
        System.out.println ("exit: " + p.exitValue());
        p.destroy();
    } catch (Exception e) {}
}

注意:不是 Linux 专家,所以我不能说 100% 你的命令行是正确的,但是你可以用这种方式执行它。

【讨论】:

    【解决方案2】:

    问题是sudoers 文件阻止了代码在没有tty 的情况下执行,稍微改变这个文件意味着它会接受代码。噩梦般的调试,因为它花了一整天!谢谢大家的意见!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 2012-09-27
      • 2020-05-01
      • 2020-07-06
      • 1970-01-01
      • 2014-07-17
      • 2023-04-01
      • 2016-08-14
      相关资源
      最近更新 更多