我有一个 USB 驱动器,当我插入它时,它会自动解密并安装。然后,安装后,我执行备份脚本以将本地 FS 同步到该磁盘。然后我弹出驱动器。
我想自动执行此操作,以便当我插入驱动器时,它会被解密并安装,脚本会被执行,并且驱动器会被卸载/弹出。 (如果我能在完成时收到通知,那就更好了,但可选。)
所以我尝试过使用 systemd,但我对其他解决方案持开放态度(尽管现在我已经花时间与 systemd 进行斗争,我真的很想了解它是如何工作的)。
目前,我尝试创建一个依赖于 USB 驱动器安装的服务。但是,当驱动器未插入时,该服务无法激活,抱怨挂载不存在。
然后我尝试创建一个路径单元:
[Unit]
Description=Monitors the backup path availability
[Path]
PathExists=/run/media/user/backup
[Install]
WantedBy=multi-user.target
当路径可用时,它将启动相应的服务:
[Unit]
Description=Rsync System Backup
Requires=usb-hd-backup.path
[Service]
ExecStart=/usr/bin/rsync -aAXS --info=progress2 --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /run/media/user/backup
[Install]
WantedBy=graphical.target
第一次就可以了。但是,当我卸载驱动器时,路径仍然存在(当我手动启动脚本时不会发生这种情况)。因此,下次我插入驱动器时,它会被解密,并且由于原始路径已经存在,因此它会安装到不同的路径(与原始路径相同,末尾附加“1”)。因此,脚本执行到不通向驱动器的路径(并且由于 /run 安装非常小而失败)。
我认为 systemd 有一些想法我在这里并没有真正理解。