Debian

Systemd 到 ExecStart 總是執行?

  • April 10, 2022

致力於創建 systemD 服務以從遠端 SSH 伺服器檢索密鑰文件,然後使用它在伺服器(而不是根驅動器)上自動掛載加密的 Luks 磁碟。

[Unit]
Description=Open encrypted data volume
After=network-online.target
Wants=network-online.target
StopWhenUnneeded=true

[Service]
Type=oneshot
ExecStart=/bin/sh -c '/etc/luks/key.sh | /sbin/cryptsetup -d - -v luksOpen /dev/disk/by-uuid/13b051b5-7f4f-4030-92da-d59f12422f40 Data_Crypt'
RemainAfterExit=true
ExecStop=/sbin/cryptsetup -d - -v luksClose Data_Crypt

這似乎可以正常工作,但是每次我執行

systemctl start unlock-data.service

我檢查了 systemd 日誌,我可以看到它既解鎖了驅動器,又鎖定了它。ExectStart 和 ExecStop 都在觸發。如果我從其中完全刪除 ExecStop 行並再次執行“systemctl start”,它將完全按預期解鎖驅動器。

我也嘗試將類型更改為“簡單”,但這也不起作用。我相信 oneshot 對我正在做的事情是正確的。

這是在 Debian 11.3 上。今天全新安裝。

為什麼每次啟動時 ExecStop 都會觸發?

該行為很可能是由於StopWhenUnneeded=true單位部分中的設置。根據手冊頁,不需要的定義是這樣的:

StopWhenUnneeded=

接受一個布爾參數。如果為 true,則不再使用該單位時將停止。請注意,為了最小化要執行的工作,systemd 預設不會停止單元,除非它們與其他單元沖突,或者使用者明確要求關閉它們。如果設置了此選項,則如果沒有其他活動單元需要它,則會自動清理一個單元。預設為假。

由於沒有其他單元依賴於這個自定義單元,systemd 會在它啟動時立即停止它。

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