Systemd 无法启动服务后

Systemd 无法启动服务后

letsencrypt.service

[Unit]
Description=Renews letsencrypt certificates
After=network.target letsencrypt_concat_fullchain_privkey.service

[Service]
Type=oneshot
WorkingDirectory=/etc/letsencrypt/
ExecStart=/usr/bin/letsencrypt renew

当我手动启动此服务时:sudo systemctl start letsencrypt它似乎没有启动该letsencrypt_concat_fullchain_privkey.service服务。我已经运行sudo systemctl start letsencrypt_concat_fullchain_privkey.service并且它正常工作。

我想要做的是,当letsencrypt.service完成时我希望它启动letsencrypt_concat_fullchain_privkey.service服务。

答案1

After=并不意味着依赖关系(仅顺序),您可以使用Requires=Wants=指令建立依赖关系。

要求=
配置对其他单元的要求依赖关系。如果此单元被激活,此处列出的单元也将被激活。如果其他单元之一被停用或激活失败,此单元将被停用。可以多次指定此选项,也可以在一个选项中指定多个以空格分隔的单元,在这种情况下将创建所有列出的名称的要求依赖关系。请注意,要求依赖关系不会影响服务启动或停止的顺序。这必须使用After=Before=选项单独配置。如果一个单元 需要一个单元 bar.service ,并使用 Requires= 配置,并且没有使用或foo.service配置顺序,那么如果 被激活,两个单元将同时启动,并且它们之间没有任何延迟 。通常,为了实现一个在处理故障服务时更为健壮的系统,最好使用 而不是。After=Before=foo.serviceWants=Requires=

请注意,此依赖类型并不意味着当此单元运行时,其他单元必须始终处于活动状态。具体来说:条件检查失败(例如ConditionPathExists=,, ConditionPathExists=…… — 见下文)不会导致Requires=与其有依赖关系的单元的启动作业失败。此外,某些单元类型可能会自行停用(例如,服务进程可能决定干净退出,或者设备可能被用户拔出),这不会传播到具有依赖关系的单元。将依赖类型与一起Requires=使用 可确保单元永远不会处于活动状态,除非有其他特定单元也处于活动状态(见下文)。BindsTo=After=

请注意,也可以通过向单元文件附带的目录添加符号链接,在单元配置文件之外配置此类型的依赖项.requires/ 。有关详细信息,请参阅上文。

想要=
的较弱版本Requires=。如果配置单元已启动,则此选项中列出的单元将启动。但是,如果列出的单元启动失败或无法添加到事务中,则不会影响整个事务的有效性。这是将一个单元的启动与另一个单元的启动挂钩的推荐方法。

请注意,此类型的依赖项也可以在单元配置文件之外配置,方法是将符号链接添加到.wants/单元文件附带的目录中。有关详细信息,请参阅上文。

参考:http://freedesktop.org/software/systemd/man/systemd.unit.html

答案2

我想要做的是,当 letsencrypt.service 完成时,我希望它启动 letsencrypt_concat_fullchain_privkey.service 服务。

然后您要将其添加到您的letsencrypt.service文件中:

ExecStartPost=/bin/systemctl start letsencrypt_concat_fullchain_privkey.service

该命令将在您输入的命令之后连续运行ExecStart=

您可以ExecStartPost=在 中阅读更多相关信息man systemd.service,或在 中查找任何systemd指令man systemd.directives

相关内容