如何在USB设备插件上运行自定义脚本?


41

在当前的Linux发行版(如Debian / CentOS / Fedora)下,如何在USB设备插件上自动执行自定义脚本的最新方法是什么?

例如,如果您要基于其UUID(或设备ID等)自动装载/复制某些文件/卸载USB大容量存储设备。

Answers:


27

将这样的行放在文件中/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子句与其他节中列出的其他类型的子句混合使用。


1
这个答案仍然有效吗?我不费吹灰之力就可以执行脚本(并触摸文件)。如果您可以提供最基本的示例,该示例在插入任何内容时执行脚本,那就太好了,我们可以从那里开始工作。
Redsandro 2013年

@Redsandro我的udev配置中有此规则的变体,并且它们正在工作。您是否已将设备插回电源并重新运行udevadm trigger?您的系统使用udev吗?如果您想在插入任何内容时运行脚本,请删除所有条件(带有的子句==)(也许语法要求一个条件,我不确定;如果需要,请使用KERNEL=="*")。
吉尔(Gilles)'所以

我也尝试过,但是由于它对您有用,因此我必须缺少一步。我将这个问题移到这里,因此我可以编写示例代码。
Redsandro

也许相关,我认为脚本可以运行多长时间有时间限制。我相信它很短(例如1秒左右)。如果花费的时间更长,那么udev将杀死它。您可以通过使用类似的背景脚本来解决此问题at。请参阅reactivated.net/writing_udev_rules.html
cheshirekow,

我想补充这一点,为了完整起见,该文件需要有后缀.rules并在目录中的文件在词汇的顺序读(约定使用数字前缀来命令他们),他们可下/etc//usr/lib/run。有关更多信息,请参见RTFM
starfry

14

我研究/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

1
您可能需要使用来重新加载udev规则udevadm control --reload-rules,具体取决于您的分布。
user44038

1
而不是at now我建议batch
恢复莫妮卡-M.Schröder2014年

当您既没有atbatch怎么办时该怎么办?我处于带有busybox的嵌入式环境中。
natenho 2015年

@natenho,您可以使用~/path/mountcopystuff.sh &- at等等,它的优点是在出现问题时会收到电子邮件通知-但在嵌入式系统上,这可能没有太大用处。
maxschlepzig 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.