我创建了一个udev规则,以同步我的USB驱动器和我的文档文件夹,但它似乎不起作用。
ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", RUN+="/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/ script /log.txt‘部分,以检查脚本是否实际执行。不过,log.txt文件仍然是空白的。
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"谢谢,
里卡多
发布于 2017-07-13 05:27:55
man udev解释说,RUN+=键不应该用于长期运行的任务:
这只能用于非常短时间运行的前台任务。长时间运行事件进程可能会阻塞此设备或依赖设备的所有进一步事件。启动守护进程或其他长时间运行的进程不适合udev;分离或不分离的分叉进程将在事件处理完成后无条件地终止。
对于使用systemd的现代系统来说,正确的方法是SYSTEMD_WANTS。来自man systemd.device:
UDEV数据库设备单元的设置可以通过单元文件配置,也可以直接从udev数据库(建议)配置。以下udev设备属性是由systemd理解的: SYSTEMD_WANTS=,SYSTEMD_USER_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脚本将被触发。
发布于 2017-07-13 05:23:07
正如@jasonwryan建议的那样,我将udev规则更改为:
ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", ENV{SYSTEMD_WANTS}="usb-auto-sync.service"与usb-自动同步服务:
[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我启用了服务,现在脚本正在启动。
https://unix.stackexchange.com/questions/378133
复制相似问题