如何解决从 udev 规则中调用变量
我有多个 udev 规则来检查 ATTRS{name}=="abc123" 并在该设备存在时调用各种函数。这些 udev 规则位于多个位置,因为这是在 bitbake 中为自定义嵌入式操作系统创建的。现在,如果我想更改此设备以测试不同的硬件,那么每次更改每个 ATTR{name} 调用都太耗时了。
我的解决方案是定义一个 var,例如$UDEVVAR="[device_name]" 在某些 conf 文件中(待定),然后将每个 ATTR{name} 调用更改为类似 ATTR{name}=="${UDEVVAR}" 的内容。
我已经在为概念证明编写的本地规则中测试了这种方法,尽管该规则没有调用。这个地方规则有点不同,虽然遵循相同的概念。我身边的任何闪存驱动器都没有定义 ATTR{name},所以我使用了 USB 鼠标和那个闪存驱动器。这个udev规则是:
SUBSYSTEM=="${UDEVVAR}",ACTION=="add",RUN+="/usr/local/bin/trigger.sh"
trigger.sh 只是将日期时间戳写入日志文件。当将 SUBSYSTEM 硬编码为 =="block" 时,规则调用成功,但在定义 UDEVVAR="block" 时,规则不会被调用。我的想法是,如果可行,那么我会定义 UDEVVAR="hidraw" 来测试鼠标。
我似乎找不到关于任何试图做这样的事情的人的太多文档。我想我犯了某种语法错误,或者 udev 规则可能不允许这样的事情。
感谢您的帮助!
解决方法
您应该能够在 udev 规则中使用 ENV。
SUBSYSTEM=="$env{UDEV_SUBSYS}",ACTION=="add",RUN+="/usr/local/bin/trigger.sh"
或者甚至将其用作过滤条件(以便有条件地运行 N 个相似的给定规则):
ENV{UDEV_SUBSYS}=="hidraw",RUN+="/usr/local/bin/trigger.sh"
然后您必须及时定义变量,例如在 /etc/environment
中(甚至使用 u-boot
setenv):
UDEV_SUBSYS="hidraw"
如果您希望在启动完成后(即从用户进程)动态更改此设置,这还不够;您必须实现一种机制,在更新环境后重新启动 udev 作为其子项。
有关详细信息,请参阅 udev manual。
注意:这和手册一样,对 systemd-udevd
有效。 YMMV 与其他 udev
口味。
编辑:/etc/environment
busybox
不太支持 init
。
请参阅 /etc/inittab
以了解您可能拥有的任何 init 脚本,并在那里获取环境文件(或设置/导出变量)。
编辑 2:遗憾的是,似乎只有 NAME
、SYMLINK
、PROGRAM
、OWNER
、GROUP
、MODE
、{{ 1}} 和 SECLABEL
字段支持替换。 :(我之前在手册中忽略了这一点。
编写一个接收设备数据作为环境并在 RUN
字段中提供以进行匹配的 shell 脚本可能会取得一些成功。如果认为匹配,则返回 0。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。