Systemd requiredBy 指令被忽略

Systemd requiredBy 指令被忽略

这是我的服务文件:

[Unit]
Description=Blabla service
Requires=network-online.target nfs-common.service
After=network-online.target nfs-common.service

[Service]
Type=oneshot
ExecStart=/path/to/script
RemainAfterExit=no

[Install]
RequiredBy=php5-fpm.service apache2.service nginx.service

当启用它时,它看起来很有希望:

# systemctl enable blabla.service 
Created symlink from /etc/systemd/system/php5-fpm.service.requires/blabla.service to /etc/systemd/system/blabla.service.
Created symlink from /etc/systemd/system/apache2.service.requires/blabla.service to /etc/systemd/system/blabla.service.
Created symlink from /etc/systemd/system/nginx.service.requires/blabla.service to /etc/systemd/system/blabla.service.

然后重新启动后systemd-analyze给我以下内容:

# systemd-analyze blame
         18.434s blabla.service
          5.942s cloud-init.service
          2.766s networking.service
          1.671s apache2.service
          1.398s cloud-init-local.service
          1.276s newrelic-sysmond.service
           856ms php5-fpm.service
           586ms nginx.service
           .....

根据文档Type=oneshot

oneshot 的行为与 simple 类似;然而,预计该进程必须在 systemd 启动后续单元之前退出。

有任何想法吗?

答案1

RequiredBy=并不意味着一项服务应该在另一项服务之后启动。

在 中man systemd.unit,文档RequiredBy=说:

主要结果是当前单元将在列出的单元启动时启动。

换句话说,它们最终可能会并行启动。我认为您需要Before=在安装部分中有一个指令。中的文档man systemd.unit有这样的说法Before=

如果单元 foo.service 包含设置 Before=bar.service 并且两个单元都正在启动,则 bar.service 的启动将延迟到 foo.service 启动为止。请注意,此设置独立于并正交于 Requires= 配置的需求依赖项。

相关内容