是否可以创建依赖于其他几个服务的服务?正确的语法是什么?
例如:
[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
目标是在操作系统重启后自动启动服务,并确保在服务之前启动日志和网络服务。
附加问题:我需要指定吗Restart
?
答案1
您发布的单元文件看起来不错。但是您在此处定义的单元没有严格依赖关系,只有弱依赖关系(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-failure
或always
(更多信息请参阅手册页systemd.service
)。
此外,您的 app.jar 需要可执行才能正常工作。如果是,并且它启动了您的应用程序,那么就没问题了。我认为 jar 必须由某些东西启动。比如java -jar app.jar
,但当然。我可能错了。