CentOS 6.9下通过Udev调用lshw获取USB硬件信息遇空文件问题求助
解决Udev调用lshw脚本生成空文件的问题
嘿,我之前在处理Udev规则调用脚本的时候也踩过一模一样的坑——手动跑脚本完全正常,Udev一调用就生成空文件,咱们来拆解下原因和解决办法:
绝对路径缺失是常见元凶:Udev运行时的PATH环境变量非常有限,和你登录shell时的PATH完全不一样,脚本里直接写
lshw大概率会找不到可执行文件。先查一下lshw的绝对路径:which lshw比如得到的结果是
/usr/sbin/lshw,那把脚本里的lshw替换成这个绝对路径,同时加上错误输出重定向方便排查问题:#!/bin/bash /usr/sbin/lshw -html > /root/test.html 2>&1设备初始化延迟导致读不到信息:Udev触发
add事件的时机其实很早,这时候USB设备可能还没完全初始化完成,lshw去读取硬件信息自然会拿不到内容。可以在脚本里加个短暂的延迟,给设备留够就绪时间:#!/bin/bash sleep 2 /usr/sbin/lshw -html > /root/test.html 2>&1检查Udev规则的匹配逻辑:先确认你的
11-add-usb.rules确实能匹配到目标USB设备。可以用udevadm监控事件来验证:udevadm monitor --env插入USB设备后,看看输出里的ACTION、SUBSYSTEM等字段是不是和规则里的条件一致。另外,规则里调用脚本的RUN指令一定要用绝对路径,比如:
ACTION=="add", SUBSYSTEM=="usb", RUN+="/root/your_script.sh" LABEL="usb_end"记得把
/root/your_script.sh换成你实际的脚本绝对路径。权限与文件系统验证:虽然Udev通常以root身份运行,但还是要确认/root目录有写入权限,且所在文件系统不是只读或noexec挂载。可以先手动测试写入:
touch /root/test.html && echo "test content" > /root/test.html如果能正常写入,那权限层面就没问题。
最后,修改完脚本和规则后,别忘重新加载Udev规则:
udevadm control --reload-rules
再重新插拔USB设备看看效果就好啦。
内容的提问来源于stack exchange,提问作者Xuesong Ye
相关产品推荐
相关产品推荐

