我有一个 systemd 服务,它在安装 USB 驱动器时调用脚本。signal.service
:
[Unit]
Description= Updater trigger
Requires=usb-drive.mount
After=usb-drive.mount
[Service]
ExecStart=/usr/bin/signal
[Install]
WantedBy=usb-drive.mount
这会产生正确的顺序。Journalctl
:
systemd[1]: Mounting /mnt/usb...
systemd[1]: Mounted /mnt/usb.
systemd[1]: usb-drive.mount: Succeeded.
systemd[1]: signal.service: Succeeded.
现在,我想在用户拔出 USB 驱动器并且系统卸载驱动器时运行脚本(删除安装点文件夹)。我创建了 udev 规则:
ACTION=="remove", KERNEL=="7-1.1",SUBSYSTEM=="usb", RUN+="/usr/bin/removeFolder.sh"
问题在于,有时在卸载驱动器之后调用该脚本,有时在卸载驱动器之前调用该脚本。
我怎样才能确保脚本在以下之后被调用:
systemd[1]: Unmounted /mnt/usb.
或者当系统卸载驱动器时如何使用systemd运行脚本?
我的目标是在卸载时删除 /mnt/usb 文件夹。也许我不需要 systemd 或 udev 规则,也许向 /etc/fstab 添加额外的规则可以做到这一点?目前,我有以下规则:
/dev/sda1 /mnt/usb auto nofail,rw 0 2
答案1
您可以找到一些信息这篇博文
基本上,udev 的手册页建议不要在较长的进程中使用 RUN+=,并且在Archlinux 论坛主题他们提出了一个使用 SYSTEMD_WANTS 的解决方案,这样您就可以为要运行的脚本提供一个 systemd 单元,并从 udev 规则中调用它。
您需要这样的东西:调用脚本的 systemd 服务:
[Unit]
Description=Delete /mnt/usb folder on unmount
Requires=usb-drive.mount
After=usb-drive.mount
[Service]
ExecStart=/usr/bin/removeFolder.sh
[Install]
WantedBy=usb-drive.mount
你的 udev 规则:
ACTION=="remove", KERNEL=="7-1.1",SUBSYSTEM=="usb", ENV{SYSTEMD_WANTS}=="removefolder.service"
正如您所说,也许从第一个 systemd 服务开始这样做更有意义。