为什么我的 udev-fired 脚本不工作?

为什么我的 udev-fired 脚本不工作?

我创建了一个 udev 规则来将我的 USB 驱动器与我的文档文件夹同步,但它似乎不起作用。

95-USB-自动同步规则

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", RUN+="/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh"

/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh

#!/bin/bash

rsync -a --delete '/home/riccardo/Documents/Development/' '/run/media/riccardo/Riccardo/Documents/Development' --exclude='*/node_modules' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/KiCAD/' '/run/media/riccardo/Riccardo/Documents/KiCAD' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/Personal Files/' '/run/media/riccardo/Riccardo/Documents/Personal Files' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/Scripts/' '/run/media/riccardo/Riccardo/Documents/Scripts' >> /home/riccardo/Documents/Scripts/log.txt

我添加了“>> /home/riccardo/Documents/Scripts/log.txt”部分来检查脚本是否实际执行。但 log.txt 文件仍为空白。

东芝 USB 驱动器 Udev 信息

  looking at device '/devices/pci0000:00/0000:00:14.0/usb4/4-2':
    KERNEL=="4-2"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{authorized}=="1"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bConfigurationValue}=="1"
    ATTR{bDeviceClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPacketSize0}=="9"
    ATTR{bMaxPower}=="296mA"
    ATTR{bNumConfigurations}=="1"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bcdDevice}=="0001"
    ATTR{bmAttributes}=="80"
    ATTR{busnum}=="4"
    ATTR{configuration}==""
    ATTR{devnum}=="2"
    ATTR{devpath}=="2"
    ATTR{idProduct}=="1408"
    ATTR{idVendor}=="0930"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="TOSHIBA"
    ATTR{maxchild}=="0"
    ATTR{product}=="USB FLASH DRIVE"
    ATTR{quirks}=="0x0"
    ATTR{removable}=="removable"
    ATTR{serial}=="C03FD5FBA9CDC1401D7FB227"
    ATTR{speed}=="5000"
    ATTR{urbnum}=="11182"
    ATTR{version}==" 3.00"

谢谢你,

里卡多

答案1

man udev解释说该RUN+=密钥不应用于长时间运行的任务:

这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。

启动守护进程或其他长时间运行的进程不适合 udev;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。

对于使用 systemd 的现代系统,正确的方法是SYSTEMD_WANTS.从man systemd.device

UDEV 数据库

设备单元的设置可以通过单元文件配置,也可以直接从 udev 数据库配置(推荐)。 systemd 可以理解以下 udev 设备属性:


SYSTEMD_WANTS=、SYSTEMD_USER_WANTS= 将设备单元的 Wants 类型依赖项添加到所有列出的单元。第一种形式由系统 systemd 实例使用,第二种由用户 systemd 实例使用。当特定设备可用时,这些设置可用于激活任意单元。

请注意,除非设备在 udev 数据库中用“systemd”字符串进行标记,否则不会考虑此标记和其他标记,因为否则设备不会作为 systemd 单元公开(见上文)。

因此,您的 udev 规则将变为:

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", SYSTEMD_WANTS="rsync_backup.service"

然后您编写一个服务文件来在安装设备时调用备份脚本:

[Unit]
Description=Backup riccardo's stuff
Requires=media-Riccardo.mount
After=media-Riccardo.mount

[Service]
ExecStart=/usr/local/bin/rsync_backup_thing

[Install]
WantedBy=media-Riccardo.mount

/media/Riccardo安装后,您的 bash 脚本将被触发。

答案2

正如 @jasonwryan 建议的那样,我将 udev 规则更改为:

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", ENV{SYSTEMD_WANTS}="usb-auto-sync.service"

使用 usb-auto-sync.service:

[Unit]
Description=Auto Sync USB

[Service]
ExecStart=/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh
StandardOutput=null

[Install]
WantedBy=multi-user.target
Alias=usbauto-sync.service

我启用了该服务,现在脚本正在触发。

相关内容