![如果从 udev 运行,脚本的执行方式会有所不同](https://linux22.com/image/64038/%E5%A6%82%E6%9E%9C%E4%BB%8E%20udev%20%E8%BF%90%E8%A1%8C%EF%BC%8C%E8%84%9A%E6%9C%AC%E7%9A%84%E6%89%A7%E8%A1%8C%E6%96%B9%E5%BC%8F%E4%BC%9A%E6%9C%89%E6%89%80%E4%B8%8D%E5%90%8C.png)
我对一个看起来很奇怪的脚本有疑问;从 udev 运行时它似乎会过早停止执行,但当我从命令行手动运行它时则不会。我已经尝试使用它进行故障排除set -x
,当我从命令行运行它时,一切都会按预期执行。然而,当它从 udev 运行时,它会在某个点之后过早停止。
我认为,部分问题是当脚本由 udev 运行时很难对其进行调试。我尝试过发表logger
声明,但他们基本上只是告诉我同样的事情(它过早停止)。
您是否看到任何弹出的内容会导致此问题?
可以找到脚本这里。关于它们的一点需要注意的是,它们适用于嵌入式系统。从命令行手动运行时,我运行的命令是:
./product.sh -b update /dev/sda1
运行脚本的udev规则是:
ACTION=="add", KERNEL=="sd?1", RUN+="/usr/sbin/product.sh -b update /dev/%k"
该脚本似乎停在几行处195或者197在product.sh
。我注意到如果我注释掉行22和28product-manifest.sh
当由 udev 运行并在命令行上手动运行时,一切都会按预期运行。
答案1
好吧,我想我已经解决了这个问题。我认为问题是线路的结果157我将输出重定向到文件;该文件恰好是已安装的 USB 驱动器。我猜测重定向是同时完成的,product-manifest.sh
完成后脚本将继续,最终导致在 USB 驱动器的并发写入完成之前卸载 USB 驱动器。当 umount 同时发生时,会发生一些错误,最终导致脚本提前终止。
修复方法是将输出重定向到 SD 卡,然后将cp
其复制到 USB 驱动器:
product-manifest.sh > "/tmp/MANIFEST"
cp "/tmp/MANIFEST" "$1"
感谢@mikeserv 为我指明了正确的方向。