Debian

Systemd 的RequiredBy 指令被忽略

  • March 7, 2017

這是我的服務文件:

[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 啟動後續單元之前退出。

有任何想法嗎?

RequiredBy=並不意味著一個服務應該一個接一個地啟動。

man systemd.unit,文件RequiredBy=說:

主要結果是目前單元將在列出的單元啟動時啟動。

換句話說,它們最終可能會並行啟動。我認為您希望Before=在安裝部分中有一個指令。中的文件man systemd.unit有這樣的說法Before=

如果一個單元 foo.service 包含設置 Before=bar.service 並且兩個單元都正在啟動,則 bar.service 的啟動將延遲到 foo.service 啟動。請注意,此設置獨立於 Requires= 配置的需求依賴關係並與之正交。

引用自:https://unix.stackexchange.com/questions/349787