首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的udev启动脚本不起作用?

为什么我的udev启动脚本不起作用?
EN

Unix & Linux用户
提问于 2017-07-13 05:01:36
回答 2查看 2.5K关注 0票数 3

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

95-usb-auto-sync.rules

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/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文件仍然是空白的。

东芝USB驱动器Udev info

代码语言:javascript
复制
  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"

谢谢,

里卡多

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 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规则将成为:

代码语言:javascript
复制
ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", SYSTEMD_WANTS="rsync_backup.service"

然后编写一个服务文件,在设备挂载时调用备份脚本:

代码语言:javascript
复制
[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脚本将被触发。

票数 4
EN

Unix & Linux用户

发布于 2017-07-13 05:23:07

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

代码语言:javascript
复制
ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", ENV{SYSTEMD_WANTS}="usb-auto-sync.service"

与usb-自动同步服务:

代码语言:javascript
复制
[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

我启用了服务,现在脚本正在启动。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/378133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档