我有两个 systemd 服务:postgresql.service
和app.service
。postgresql.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.service
它postgresql.service
在app.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.service
让systemctl daemon-reload
systemd 创建新的符号链接