我正在尝试使用 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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
90-backup.rules
KERNEL=="sd*", ATTRS{serial}=="<HD SERIAL HERE>", TAG+="systemd", ENV{SYSTEMD_WANTS}+="backup.service"
Run Code Online (Sandbox Code Playgroud)
问题:
现在我希望 mnt-backup.mount 在 backup.service 完成后立即停止。
根据文档ExecStartPost=将在 ExecStart= 中的命令之后执行,所以我尝试添加
ExecStartPost=/usr/bin/systemctl stop mnt-backup.mount
Run Code Online (Sandbox Code Playgroud)
到backup.service,即使我意识到它停止了mnt-backup.mount,它本身绑定了它,据我所知,实际上需要在mnt-backup.mount之前停止backup.service才能正常停止,因此产生循环依赖。
在测试这个时,它在我遇到内核恐慌之前运行了几次,这是我在我的机器上看到的第一次,所以它让我想知道这是否是某种原因。
无论如何,我的方法正确吗?