You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:25:04