systemd - 取決於它的服務完成後解除安裝設備
我正在嘗試使用 udev 規則和 systemd 實現自動備份機制。這個想法是在熱插拔特定儲存設備時啟動備份常式,與這個問題非常相似,順便說一下我自己提供了一個答案,但在這裡我有興趣討論一些進一步的調整。即我希望在備份服務完成後解除安裝設備。
一些背景:
到目前為止,我使用 udev 啟動了一個 systemd 服務,該服務本身執行一個備份常式。相關文件如下:
備份服務
[Unit] Description=<DESCRIPTION HERE> BindsTo=<STORAGE DEVICE UNIT HERE>.device mnt-backup.mount After=<STORAGE DEVICE UNIT HERE>.device mnt-backup.mount [Service] ExecStart=<CALL TO BACKUP SCRIPT HERE>
mnt-backup.mount
[Unit] DefaultDependencies=no Conflicts=umount.target Before=umount.target [Mount] What=/dev/disk/by-uuid/<DEVICE UUID HERE> Where=/mnt/backup Type=<FILESYSTEM HERE>
90-backup.rules
KERNEL=="sd*", ATTRS{serial}=="<HD SERIAL HERE>", TAG+="systemd", ENV{SYSTEMD_WANTS}+="backup.service"
問題:
現在我希望 mnt-backup.mount 在 backup.service 完成後立即停止。
根據文件ExecStartPost=將在 ExecStart= 中的命令之後執行,所以我嘗試添加
ExecStartPost=/usr/bin/systemctl stop mnt-backup.mount
到backup.service,即使我意識到它會停止mnt-backup.mount,它本身就是綁定的,據我所知,實際上需要在mnt-backup.mount之前停止backup.service以優雅地停止,因此產生循環依賴。
在測試這個時,它工作了幾次,然後我經歷了核心恐慌,這是我在我的機器上看到的第一次,所以它讓我想知道這是否是某種原因。
無論如何,我的方法正確嗎?
雖然我不確定之前的方法是否能保證有效,但有一種替代方法看起來更可取。
神奇的屬性稱為StopWhenUnneeded。這應該在下設置為 true
$$ Unit $$在掛載文件中,所以它變成: mnt-backup.mount
[Unit] DefaultDependencies=no Conflicts=umount.target Before=umount.target StopWhenUnneeded=true [Mount] What=/dev/disk/by-uuid/<DEVICE UUID HERE> Where=/mnt/backup Type=<FILESYSTEM HERE>
就如此容易。
這種方法的最大優勢在於它得到 systemd 的明確支持,因此可以保證工作。
我還強烈建議在服務單元中將 RefuseManualStart設置為 true,從而禁止使用者手動啟動服務。這個想法正是為了自動化備份機制,因此使用者不應該能夠明確地啟動它,所以最好把這個責任完全交給 udev。