我希望我的服务(取决于 PostgreSQL)在启动时启动,因此我enable
使用 来完成此操作systemd
,并在.service
文件中我将它称为Wants
postgres 服务:
[Unit]
Description=My service
Wants=postgresql-12
[Service]
User=root
WorkingDirectory=/path/to/myservice
ExecStart=/path/to/myservice/my_service -d
[Install]
WantedBy=multi-user.target
myservice
无法在启动时启动,因为 PostgreSQL 服务器尚未启动(我可以在日志中看到这一点)。稍后使用 启动时systemctl start myservice
,它可以正常启动,因此文件似乎.service
是有效的。
为什么systemctl
在启动我的服务之前不等待 Postgres?我也尝试使用 进行检查systemd-analyze blame
,但似乎只显示正在运行的服务。
答案1
Wants=
并不意味着After=
,因此您需要指定两者。
虽然在某些情况下确实如此,但大多数情况下只有当目标“想要”另一个单元。(因此,当 multi-user.target 具有 Wants=your.service 时,它将暗示 After=your.service。)但这是一个例外;一般规则是,排序不会根据依赖关系自动设置。
此外,Wants= 和 After= 都需要“完整”的单元名称 - 尽管“postgresql-12”对于 systemctl 来说已经足够,但您必须postgresql-12.service
在单元文件中指定它。