Systemd

如何在升級依賴項時重新啟動我的 systemd 服務

  • December 6, 2020

我編寫了一個使用 Postgres 數據庫的程序,並為它編寫了一個 systemd 服務文件。目前我的服務在啟動時啟動得很好,當 Postgres 停止升級時它會停止(按apt upgrade)。但是,當升​​級完成並再次啟動 Postgres 時,我的服務並沒有自動啟動。

我可以定義一些依賴項來讓我的服務自動重新啟動嗎?

這是我的服務在 Postgres 升級過程中自動停止後的狀態:

● tabill.service - My service
  Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
  Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
Main PID: 1048 (code=killed, signal=TERM)

請注意,我可以再次手動啟動服務就好了。

這是我的服務文件:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

我試過添加PartOf=postgresql.serviceand BindsTo=postgresql.service,然後手動停止和啟動 Postgres,但都沒有幫助。

當然,我可以刪除Requires,但最好同時停止這兩個服務,只要它們都能重新啟動。

我找到了答案:我需要將服務文件的最後一行更改為:

WantedBy=postgresql.service

這樣,每當啟動 Postgres 時,我的服務也會啟動 - 但如果我的服務失敗,這不會停止 Postgres。

本節中的指令[Install]僅影響單元的啟用和禁用。但是當我的服務已經啟用時,事情就沒有這麼簡單了:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

錯誤消息具有誤導性。修復它很簡單:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

現在,只要 Postgres 執行,我的服務就會停止並啟動。當系統啟動時,自然會啟動 Postgres。

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