4

USB デバイスの挿入後に bash スクリプトを実行する udev ルールを作成しました

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

ただし、スクリプトは 1 回だけではなく数回実行されます。ハードウェアの検出方法に問題があると思いますか? スクリプトと fi に sleep 10 を入れてみましたが、違いはありません。

4

1 に答える 1

0

これは解決策ではありませんが、回避策です:
1 つの (簡単な) 方法は、スクリプト "/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 は少し遅いため、これが常に機能することを確認する方法はありません) が、あなたのケースでは完全に機能する可能性があります。

もう 1 つの方法 (より確実ですが、より多くのコード) は、次のように "/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

ブート中に (たとえば、/etc/rc.local によって) 開始して、継続するシグナルを待機するようにします...「継続」シグナルをいくつ取得しても問題ありません (それらはキューに入れられません)。 $TIME 以内である限り

それに応じて udev ルールを変更します。

SUBSYSTEMS=="usb", ATTRS{serial}=="00000000", SYMLINK+="Kingston", RUN+="/usr/bin/pkill -SIGCONT flashled.sh"
于 2013-11-14T18:31:31.510 に答える