由于依赖项更新而启动已停止的服务

由于依赖项更新而启动已停止的服务

我有两个 systemd 服务:postgresql.serviceapp.servicepostgresql.service是发行版提供的(ubuntu 15.10),app.service由我自己编写。

由于app需要postgresql,该服务如下所示:

[Unit]
Description=Start App

Requires=postgresql.service
After=postgresql.service

[Install]
WantedBy=multi-user.target

[Service]
Restart=always
ExecStart=/path/to/app

今天 postgresql 已经更新。当然,它会postgresql.service自动重新启动更新后。但这杀死了我的app.service,因为它需要postgresql

# systemctl status app
[...]
Apr 08 12:04:42 host systemd[1]: Stopping Start App...
Apr 08 12:04:42 host systemd[1]: Stopped Start App.

Apr 08 12:04:42是更新发生的时间postgresql

我怎样才能改变它app.service,以便它在重新启动时不会简单地被杀死postgresql,而是也自动(重新)启动(当然,只有在启用它时)?

或者换个方式问:我如何配置app.servicepostgresql.serviceapp.service启用后总是自动启动?所以基本上是systemctl start postgresql先启动postgresql然后自动app

答案1

我认为 systemd 希望我使用Wants而不是Requires。摘自手册:

要求=

配置对其他单元的需求依赖关系。如果此单元被激活,则此处列出的单元也将被激活。如果其他单元之一被停用或激活失败,则此单元将被停用。[...] 通常,使用 Wants= 而不是 Requires= 是更好的选择,以便在处理故障服务时实现更强大的系统。

现在使用Wants,这似乎正是我真正想要的,一个处理故障服务的强大系统。所以我这么做了。

答案2

您可以添加postgresql.service到您的服务中WantedBy

[Unit]
Description=Start App

Requires=postgresql.service
After=postgresql.service

[Install]
WantedBy=multi-user.target postgresql.service

[Service]
Restart=always
ExecStart=/path/to/app

不要忘记systemctl reenable app.servicesystemctl daemon-reloadsystemd 创建新的符号链接

相关内容