Systemd
如何在升級依賴項時重新啟動我的 systemd 服務
我編寫了一個使用 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.service
andBindsTo=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。