我正在编写一个可以运行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.
答案 0 :(得分:0)
您可能正在使用sudo
调用las
运行第一项服务。该流程以root
开头,但您明确告诉它service
为User=las
。
然后,您尝试拨打systemctl start service2
,但这需要root权限,service
正在las
运行。 systemctl
尝试提示您输入密码,但它不能,因为service1
不在交互式上下文中运行,因此需要关于"交互式身份验证的错误&# 34 ;.
我猜你可能想要使用systemd" user"相反,它将作为您的用户而不是root用户运行,并且不需要User=
指令,也不需要sudo
密码来启动服务。
根据您设置的DISPLAY
变量,我还看到这些是与特定显示相关联的图形应用。
您可以尝试使用桌面"自动启动"功能可让您在登录时启动应用,而不是systemd
..