【问题标题】:Start a Systemd service within a Java application在 Java 应用程序中启动 Systemd 服务
【发布时间】:2018-10-04 07:34:39
【问题描述】:

我正在编写一个可以运行 systemd 服务的 Java 应用程序。

我有两个 systemd 服务(service1service2)。 service1 将启动 Java 应用程序。然后在应用程序内部它应该启动service2。 我使用以下语句启动service2

Runtime.getRuntime().exec(new String[]{"sh", "-c", "systemctl start service2"});

但是 service2 没有启动。 (虽然命令执行没有任何例外)知道为什么吗?

编辑:

我用sudo systemctl start service1启动了第一个服务。

服务 1 如下所示。

[Unit]
Description=Service 1

[Service]
WorkingDirectory=/usr/test
Environment="DISPLAY=:0"
User=las
ExecStart=/usr/bin/java -jar test.jar

[Install]
WantedBy=graphical.target

服务 2 如下所示

[Unit]
Description=Service 2

[Service]
WorkingDirectory=/usr/test
Environment="DISPLAY=:0"
User=las
ExecStart=/usr/bin/java -jar abc.jar

[Install]
WantedBy=graphical.target

编辑 2

在以某种方式更改代码以查看 Runtime.getRuntime().exec() 的输出流后,我知道它正在返回以下错误。

Failed to start service2.service: Interactive authentication required.

【问题讨论】:

  • 哪个用户正在运行应用程序?您收到了哪些错误消息?你做了什么来调试你的程序?
  • @baao 我编辑了问题。
  • 问题可能与权限有关。检查 /var/log/auth.log 中是否有错误。
  • @cisk 请参阅编辑 2

标签: java ubuntu-16.04 systemd


【解决方案1】:

您可能正在使用sudo 调用作为las 运行第一个服务。该过程以root 开始,但您明确告诉它以User=las 运行service

然后,您尝试调用systemctl start service2,但这需要root 权限并且servicelas 运行。 systemctl 试图提示您输入密码,但它不能,因为service1 不是在交互式上下文中运行,因此出现“需要交互式身份验证”的错误。

我猜你可能想使用 systemd“用户”服务,它会以你的用户而不是 root 身份运行,并且不需要 User= 指令,也不需要sudo 密码来启动服务。

我还看到这些是与特定显示器相关联的图形应用程序,基于您设置的 DISPLAY 变量。

您可以尝试使用桌面的“自动启动”功能在您登录时启动应用程序,而不是通过systemd..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多