Скрипт автозапуска при подключении карты Wi-Fi (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состоянию вашего журнала. Причина этого в том, что персонаж не >имеет никакого особого значения в вашем контексте. Это просто третий аргумент командной строки, который вы передали echo. Вы получите то, что хотите, если позволите своей оболочке интерпретировать данную строку /bin/echo 'test' > /test.txt. Как вы сделали в своем втором редактировании. Например, если вы позволите udevвыполнить touch /test.txtв отличие от того, что вы сделали, вы увидите новый файл в своем корне.
user1146332

Ответы:


4

Я был похож проблема некоторое время назад , и решение было изменить RUN+=часть к RUN+="sh -c '/root/test.sh'". Теперь я не знаю, нужно ли вам это в этом случае, так как правило вызывает скрипт, а не команду.

Еще одно наблюдение: попробуйте удалить !из "test!"строки или заменить двойные кавычки одинарные кавычки. Взрыв !, вероятно, создает проблемы из-за его особого значения в оболочке, и двойные кавычки сохраняют это значение.


С или без !это не работает.
TCB13

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"работает, но по какой-то причине он получил "тест", записанный в файле 8 раз. Похоже, команда выполняется несколько раз: S
TCB13

3

Я бы посоветовал установить приоритет ведения журнала udevс errпо на infoс

 udevadm control --log-priority=info

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.