在当前的Linux发行版(如Debian / CentOS / Fedora)下,如何在USB设备插件上自动执行自定义脚本的最新方法是什么?
例如,如果您要基于其UUID(或设备ID等)自动装载/复制某些文件/卸载USB大容量存储设备。
在当前的Linux发行版(如Debian / CentOS / Fedora)下,如何在USB设备插件上自动执行自定义脚本的最新方法是什么?
例如,如果您要基于其UUID(或设备ID等)自动装载/复制某些文件/卸载USB大容量存储设备。
Answers:
将这样的行放在文件中/etc/udev/rules.d
:
KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"
添加一个子句,例如,NAME="subdir/mydisk%n"
如果您想在下使用自定义输入路径/dev
。
运行udevadm info -a -n sdb
以查看可以匹配哪些属性(attribute=="value"
;替换sdb
为自动分配给磁盘的设备名称,该名称对应于插入磁盘时在其中创建的新条目/dev
)。请注意,您可以使用ATTRS
任何一个节中的子句:您可以选择任何节,但是这些ATTRS
子句必须全部来自同一节,并且不能混合和匹配。您可以将ATTRS
子句与其他节中列出的其他类型的子句混合使用。
udevadm trigger
?您的系统使用udev吗?如果您想在插入任何内容时运行脚本,请删除所有条件(带有的子句==
)(也许语法要求一个条件,我不确定;如果需要,请使用KERNEL=="*"
)。
at
。请参阅reactivated.net/writing_udev_rules.html
我研究/lib/udev/rules.d
了磁盘相关规则的示例。在Ubuntu系统上,一个规则文件提供了ID_FS_UUID_ENC
您可以在自己的规则文件中使用的环境变量。
因此,我将自定义规则文件放在下/etc/udev/rules.d/foodevice.rules
。由于没有前缀数字,因此最后由udev运行。顺便说一句,udev守护程序监视/etc/udev/rules.d
着更改,因此您无需在文件更改时重新启动它。
的内容/etc/udev/rules.d/foodevice.rules
是:
ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"
(这是一条规则-您必须删除ENV子句之后的换行符,因为udev没有行继续机制)
由udev启动的程序将阻止守护程序-因此它不应长时间运行。我通过at
-即通过与执行实际工作的流程分离来解决它:
$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
udevadm control --reload-rules
,具体取决于您的分布。
at now
我建议batch
。
~/path/mountcopystuff.sh &
- at
等等,它的优点是在出现问题时会收到电子邮件通知-但在嵌入式系统上,这可能没有太大用处。