Автоматический запуск сценария при подключении Wifi-карты (udev)

Я пытаюсь использовать 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 файл 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 кодом выхода для успешного завершения? Если да, то почему я не получаю никаких файлов в системе?


EDIT 2:

Мне удалось получить эту работу, используя подсказку @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!" string или заменить двойные кавычки одиночными кавычками. Взрыв ! вероятно, создает проблемы из-за его особого значения в оболочке, а двойные кавычки сохраняют это значение.

Моей рекомендацией было бы установить приоритет ведения журнала udev от err до info с

  udevadm control --log-priority=info 

Если вы хотите увидеть еще больше информации, установите его для debug . Теперь вы можете найти очень подробную информацию о том, что udev сделал в /var/log/daemon.log (по крайней мере, в связанной с debian системе). Как правило, это помогает много чеканки ошибок.

Это лишь дополнение к ответу htor, который, вероятно, решит вашу проблему.