具有多个 After 的 systemd 服务

naX*_*aXa 10 linux service systemd

是否可以创建一个依赖于其他几个服务的服务?什么是正确的语法?

如:

[Unit]
Description=service description
Wants=network.target
After=network.target
After=syslog.target

[Service]
User=bootapp
ExecStart=/var/app/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

目标是在操作系统重新启动后自动启动服务,并确保在服务之前启动日志记录和网络服务。

附加问题:我需要指定Restart吗?

小智 16

您发布的单元文件看起来不错。但是您在此处定义的单元没有严格的依赖关系,只有弱(Wants=而不是Requires=)。这意味着如果 network.target 不存在或者它无法启动,无论如何都会启动这个单元。After=(和Before=) 仅用于排序,而不用于依赖项管理。因此,如果您的应用需要其他服务,请使用Requires=. 如果需要该服务之前,它本身也可以启动,请After=另外。

要使您的设备在启动后自动启动,您必须启用它。Systemd 需要知道从哪里开始链接它,这就是WantedBy=[Install]部分中的用途。编辑单元文件并将其保存后,/etc/systemd/system/my-unit.service您必须重新加载 systemd 守护程序以使其接收新单元,然后才能启用它;命令是systemctl daemon-reload. 要启用单位类型systemctl enable my-unit.service。这会在/etc/systemd/system/multi-user.target.wants/您的单元文件中添加一个符号链接。

要手动启动它,您可以输入systemctl start my-unit.service.

Restart=仅当您希望应用程序退出时自动重新启动时才需要。何时重新启动有不同的可能性,例如on-failurealways(更多在 的手册页中systemd.service)。

此外,您的 app.jar 需要可执行才能使其工作。如果是这样并且它启动了您的应用程序,那就没问题了。我认为一个罐子必须由某事启动。喜欢java -jar app.jar,但是ofc。我在这里可能是错的。