Wifiカードが接続されたときにスクリプトを自動実行(udev)


9

私は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"

udevadm control --log-priority=info@ user1146332が提案したように設定することができ、この興味深いログを取得しました。

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正常に終了するための終了コードではありませんか?もしそうなら、なぜシステム上にファイルを取得しないのですか?


編集2:

@htorのヒントを使って、なんとかこれを機能させることができました。私の現在のルール:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"

しかし、何らかの理由でコマンドが8回実行されるように、これを回避する方法はありますか?ワイヤレスカードのドライバーが読み込まれているときに、仮想的にカードをマウント解除およびマウントする必要があるため、このようなことが起こっていると思います。チップ?


1
編集に関連:/bin/echoあなたのログが示唆するように、私はそれが正常に実行されたと確信しています。コマンドの出力は、test > /test.txtログの状態と同じです。その理由は、>あなたの文脈ではキャラクターは特別な意味を持たないからです。これは、に渡した3番目のコマンドライン引数ですecho。シェルに指定された行を解釈させると、必要なものが得られます/bin/echo 'test' > /test.txt。2回目の編集で行ったように。たとえば、udev実行touch /test.txtしたこととは対照的に実行を許可すると、ルートに新しいファイルが表示されます。
user1146332 2012

回答:


4

私が持っていた似問題をしばらく前に、溶液を変更したRUN+=の部分をRUN+="sh -c '/root/test.sh'"。ルールがコマンドではなくスクリプトを呼び出すため、この場合に必要かどうかはわかりません。

別の観察:文字列!からを削除する"test!"か、二重引用符を一重引用符で置き換えてみてください。!シェルでの特別な意味のために、bang はおそらく問題を引き起こしており、二重引用符はその意味を保持します。


それがあってもなくて!も機能しません。
TCB13 2012

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"動作しますが、何らかの理由で、ファイルに8回「テスト」が書き込まれました。コマンドが複数回実行されているようです:S
TCB13

3

私のアドバイスは、ロギング優先順位の設定をするだろうudevからerrinfoして

 udevadm control --log-priority=info

さらに詳しい情報を確認したい場合は、に設定してくださいdebug。これudevで、/var/log/daemon.log(少なくともdebian関連システムでは)何が行われたかに関する非常に詳細な情報を見つけることができます。一般的に、それは多くの追跡エラーに役立ちます。

これは、おそらくあなたの問題を解決するhtorの答えを補足するものにすぎません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.