我有一个由 启动的 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 应用程序没有运行。检查日志后,我发现服务systemd
因postgresql
更新而停止。显然是在升级前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/ 目录中添加符号链接来在单元配置文件之外配置此类型的依赖项。有关详细信息,请参阅上文。