依赖完成后重启 Systemd 单元

依赖完成后重启 Systemd 单元

我有一个由 启动的 Web 应用程序systemd。它使用 Postgresql 作为数据库,因此它依赖于它。这是我的 Web 应用程序的单元文件(我已删除不相关/敏感部分):

[Unit]
Description=xxxx
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
PermissionsStartOnly=true
SyslogIdentifier=xx-service
User=yyy
Group=zzz
ExecStart=/opt/.../xx
WorkingDirectory=/opt/xx
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

主机操作系统是Ubuntu服务器16.04。

我最近遇到过这样的情况:早上我回到工作岗位时,Web 应用程序没有运行。检查日志后,我发现服务systemdpostgresql更新而停止。显然是在升级前aptitude停止的postgresql,并在更新后重新启动。当我登录到机器时,它正在运行。

systemd在停止之前决定停止我的 Web 应用程序postgresql,这很好,但在重新启动后没有重新启动 Web 应用程序postgresql

服务重启后如何指示systemd重新启动应用程序?postgresql

答案1

我认为您正在寻找PartOf

PartOf= 配置依赖项,类似于 Requires=,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一个单向依赖项 — 对此单元的更改不会影响列出的单元。

当在 a.service 上使用 PartOf=b.service 时,此依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service。不能直接指定 ConsistsOf= 依赖关系。

添加PartOf=postgresql.service到您的 Web 应用程序的单元文件中,重新加载systemctl-daemon并测试。

postgresql.service为了解决您的 Web 应用程序启动后必须自动启动的情况,您可以结合PartOf使用Wants,但在postgresql的单元文件中:

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

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

相关内容