systemd 服務腳本的掛載消失
我有以下類型的 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=
本身太簡潔了,並沒有真正詳細說明這些細節。這裡可能有機會改進該選項的文件。)