如果从 udev 运行,脚本的执行方式会有所不同

如果从 udev 运行,脚本的执行方式会有所不同

我对一个看起来很奇怪的脚本有疑问;从 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或者197product.sh。我注意到如果我注释掉行2228product-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 为我指明了正确的方向。

相关内容