在Java应用程序中启动Systemd服务

时间:2018-04-24 06:36:35

标签: java ubuntu-16.04 systemd

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

我有两个系统服务( service1 service2 )。 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.

1 个答案:

答案 0 :(得分:0)

您可能正在使用sudo调用las运行第一项服务。该流程以root开头,但您明确告诉它serviceUser=las

然后,您尝试拨打systemctl start service2,但这需要root权限,service正在las运行。 systemctl尝试提示您输入密码,但它不能,因为service1不在交互式上下文中运行,因此需要关于"交互式身份验证的错误&# 34 ;.

我猜你可能想要使用systemd" user"相反,它将作为您的用户而不是root用户运行,并且不需要User=指令,也不需要sudo密码来启动服务。

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

您可以尝试使用桌面"自动启动"功能可让您在登录时启动应用,而不是systemd ..