私はudev
を使用して、ワイヤレスカードが接続されているときにDebianシステムにbashスクリプトを実行させようとしています。
これまでのところ、このファイルを作成しました/etc/udev/rules.d/wifi-detect.rules
:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"
そして今のところ、このコンテンツでtest.sh
を機能させるようにしています:
#!/bin/bash
/bin/echo "test!" > /test.txt
しかし、何らかの理由で、ワイヤレスカードを接続しても何も起こらないようで、test.txt
ファイルは作成されません。
カードのlsusb
:
Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
udevadm monitor –env
を実行すると、カードを接続すると次のようになります。
KERNEL[1017.642278] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
KERNEL[1017.644676] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1017.645035] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
KERNEL[1017.708056] remove /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.714772] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
UDEV [1017.733002] remove /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.772669] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.798707] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1018.456804] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
KERNEL[1018.465994] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan0 (net)
KERNEL[1018.479878] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
KERNEL[1018.483074] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
UDEV [1018.600456] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
UDEV [1018.604376] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
UDEV [1018.626243] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
KERNEL[1018.659318] move /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV [1018.758843] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV [1018.932207] move /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
たくさんの例を試しましたが、うまくいきません。誰かがこれで私を助けてくれることを願っています;)ありがとう!
簡単にするために、ルールを次のように変更しました。
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"
@ user1146332が提案したように、なんとかudevadm control --log-priority=info
を設定し、次の興味深いログを取得しました。
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: RUN '/bin/echo 'test' > /test.txt' /etc/udev/rules.d/wifi-detect.rules:1
Sep 9 16:27:53 iklive-rpi1 udevd[1544]: starting 'firmware.agent'
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 queued, 'remove' 'firmware'
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 forked new worker [1547]
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: 'firmware.agent' [1544] exit with return code 0
Sep 9 16:27:53 iklive-rpi1 udevd[1548]: starting '/bin/echo 'test' > /test.txt'
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 running
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: no db file to read /run/udev/data/+firmware:1-1.3.4: No such file or directory
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: passed -1 bytes to netlink monitor 0x1af5ee0
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 done with 0
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 processed with 0
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt'(out) 'test > /test.txt'
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt' [1548] exit with return code 0
それで... return code 0
は正常に完了するための終了コードではありませんか?もしそうなら、なぜ私はシステム上にファイルを取得しないのですか?
@htorのヒントを使用して、これを機能させることができました。私の現在のルール:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"
しかし、何らかの理由でコマンドが8回実行されるように、これを回避する方法はありますか?ワイヤレスカードドライバがロードされているときに、カードを事実上アンマウントしてマウントする必要があるため、これが起こっていると思います。チップ?
しばらく前に 同様の問題 があり、解決策はRUN+=
部分をRUN+="sh -c '/root/test.sh'"
に変更することでした。ルールがコマンドではなくスクリプトを呼び出すため、この場合に必要かどうかはわかりません。
別の観察:!
文字列から"test!"
を削除するか、二重引用符を一重引用符で置き換えてください。ビッグバン!
は、シェルでの特別な意味のためにおそらく問題を引き起こしており、二重引用符はその意味を保持します。
私のアドバイスはudev
のロギング優先度をerr
からinfo
に設定することです
udevadm control --log-priority=info
さらに詳しい情報を確認したい場合は、debug
に設定してください。これで、udev
が/var/log/daemon.log
で行った詳細な情報を見つけることができます(少なくともdebian関連システムでは)。一般的に、それは多くの追跡エラーに役立ちます。
これは、おそらくあなたの問題を解決するhtorの答えを補足するものにすぎません。