Mount

systemd 服務腳本的掛載消失

  • December 9, 2018

我有以下類型的 systemd 服務文件。

[Unit]
Description=Mount some special file systems
After=local-fs.target
Before=syslog.service

[Service]
Type=oneshot
ExecStart=/root/some-complicated-mounts.sh
ExecStop=/root/some-complicated-umounts.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

該腳本/root/some-complicated-mounts.sh掛載一些文件系統。

RemainAfterExit=yes在我添加聲明之前,該服務無法正常工作。如果沒有此語句,腳本完成的掛載似乎會消失,儘管根據日誌,腳本已成功執行。

我想知道,為什麼我需要該RemainAfterExit=yes語句以及 systemd 文件中描述此行為的位置。

沒有這個 oneshot 服務將無法工作,RemainAfterExit=yes因為 systemd 會認為該單元將在some-complicated-mounts.sh腳本完成後立即變為非活動狀態,此時它將停止該單元,其中包括執行ExecStop=命令,然後繼續解除安裝文件系統通過執行some-complicated-umounts.sh腳本。

使用解決了這個問題,因為該單元在命令完成RemainAfterExit=yes後被認為已啟動並保持在活動狀態。因此,只有當設備被明確停止(使用命令)或作為正常關閉程序的一部分時,當所有設備都停止時,該命令才會執行。ExecStart=``ExecStop=``systemctl stop


關於文件,systemd 文件實際上有一個針對這種情況的範例:請參閱systemd.service(5) 手冊頁上的“範例 3. 可停止的 oneshot 服務” 。該範例案例的描述說:

與 oneshot 服務類似,有時某些單元需要執行一個程序來設置某些內容,然後執行另一個程序來關閉它,但是當它們被視為“啟動”時,沒有程序保持活動狀態。

$$ … $$ 為此,systemd 知道設置RemainAfterExit=yes,如果 start 操作成功退出,這會導致 systemd 認為該單元處於活動狀態。

還將其與範例 2進行對比,範例 2是一個沒有ExecStop=.

(不幸的是,文件RemainAfterExit=本身太簡潔了,並沒有真正詳細說明這些細節。這裡可能有機會改進該選項的文件。)

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