这是我的服务文件:
[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= 配置的需求依赖项。