linux udev规则多次运行bash脚本

fjnneemd  于 2023-01-20  发布在  Linux
关注(0)|答案(2)|浏览(253)

我创建了一个udev规则,用于在插入usb设备后执行bash脚本

SUBSYSTEMS=="usb", ATTRS{serial}=="00000000", SYMLINK+="Kingston", RUN+="/bin/flashled.sh"

然而,脚本运行了几次,而不是一次,我认为这是硬件检测的方式?我试图把睡眠10到脚本和fi,但它没有区别。

yduiuuwa

yduiuuwa1#

这不是解决方案,而是变通方法:
一种方法(简单)是这样开始脚本“/bin/flashled.sh

#!/bin/bash
#this file is /bin/flashled.sh

#let's exit if another instance is already running
if [[ $(pgrep -c "$0" ) -gt 1 ]]; then exit ;fi

... ... ...

然而,在某些边界情况下,这可能会有点容易出现争用情况(bash有点慢,因此无法确保它始终有效),但在您的情况下,它可能会完美地工作。
另一种方法(更可靠,但代码更多)是以“/bin/flashled.sh“开头,如下所示:

#!/bin/bash
#this file is /bin/flashled.sh
#write in your /etc/rc.local: /bin/flashled.sh & ; disown
#or let it start by init.    

while :
do
    kill -SIGSTOP $$ # halt and wait
    ... ...          # your commands here
    sleep $TIME      # choose your own value here instead of $TIME
done

在 Boot 过程中启动它(例如,通过/etc/rc.local),这样它将等待信号继续...它获得多少“继续”信号(它们不排队)并不重要,只要它们在$TIME内即可
相应地更改udev规则:

SUBSYSTEMS=="usb", ATTRS{serial}=="00000000", SYMLINK+="Kingston", RUN+="/usr/bin/pkill -SIGCONT flashled.sh"
gojuced7

gojuced72#

我认为这可能是因为使用了复数形式的SUBSYSTEMSATTRS密钥。我对udev的理解是,这些密钥将匹配父设备(请参阅http://www.reactivated.net/writing_udev_rules.html#hierarchy的“设备层次结构”部分)。尝试使用SUBSYSTEMATTR来匹配该设备。

相关问题