【问题标题】:How to check , if a service is running on linux machine using java code如何使用java代码检查服务是否在linux机器上运行
【发布时间】:2019-03-17 14:22:50
【问题描述】:

我想检查在 linux 上运行的服务的状态。 在机器上,我使用命令“systemctl is-active service-name”来检查服务的状态。它给出的输出为活动/非活动(当服务正在运行/未运行时)。

我想在 java 中获取服务的状态。我是怎么做到的?

我试过这个..

String SERVER_STATUS = new String[]{SUDO_COMMAND, "systemctl is-active vpnd.service"};
try {
    final Process process = new ProcessBuilder(SERVER_STATUS).start();
    process.waitFor();
    InputStream in = process.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line = null;
    System.out.println("status: " + br.readLine());
} catch (IOException | InterruptedException e) {}

但是br.readLine() 是空的。

【问题讨论】:

标签: java linux bash unix


【解决方案1】:

我认为这是因为运行应用程序时出错。你的java进程有权限运行systemctl吗?是不是找不到服务?

我建议您也检查退出值,然后检查相应的错误流。


例如在 Windows 机器上,如果我在 cmd 命令中出错了

String[] SERVER_STATUS_COMMAND = {"cmd.exe", "/c", "echoo foobar"};

你的程序会写

status: null

如果我们稍微调整应用程序,我们可以将错误流重定向到输出:

final Process process = new ProcessBuilder(SERVER_STATUS_COMMAND)
    .redirectErrorStream(true)
    .start();

那么程序会这样写:

status: 'echoo' is not recognized as an internal or external command,

【讨论】:

  • 我尝试使用“.redirectErrorStream(true)”,现在正在编写.. 管理员。它通常归结为这三件事: sudo:没有 tty 存在并且没有指定 askpass 程序,因为服务以用户“nobody”运行,并且命令将由用户“gateway”执行。所以我改变了命令如下。 SERVER_STATUS = new String[]{"/usr/bin/sudo","systemctl is-active vpnd.service"};并禁用密码如下.. echo 'gateway ALL=(ALL) NOPASSWD: /usr/bin/systemctl is-active vpnd.service' >> "/etc/sudoers" 仍然面临同样的问题。
【解决方案2】:

我发现了两件事

  • 请拆分命令
  • 使用命令的绝对路径

例子

String SERVER_STATUS[] = new String[]{"sudo", "/usr/bin/systemctl", "is-active",  "java-linux-sample.service"};
        try {
            final Process process = new ProcessBuilder(SERVER_STATUS).redirectErrorStream(true).start();
            process.waitFor();
            InputStream in = process.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            //String line = null;
            System.out.println("status: " + br.readLine());
        } catch (Exception e)
          {
          e.printStackTrace();
          }

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    相关资源
    最近更新 更多