卸载 USB 驱动器时使用 systemd 运行脚本

卸载 USB 驱动器时使用 systemd 运行脚本

我有一个 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 服务开始这样做更有意义。

相关内容