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


EDIT 2:

Мені вдалося налагодити цю роботу за допомогою підказки від @htor. Моє поточне правило:

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

Але чомусь команда виконується як 8 разів, чи є спосіб уникнути цього? Я думаю, що це відбувається, тому що коли завантажуються драйвери бездротових карт, їм потрібно практично відключити та встановити картку. Поради?


1
пов'язаний з EDIT: Я впевнений, що /bin/echoфайл було виконано успішно, як підказує ваш журнал. Результатом вашої команди є стан test > /test.txtваших журналів. Причиною цього є те, що персонаж >взагалі не має особливого значення у вашому контексті. Це лише третій аргумент командного рядка, до якого ви перейшли echo. Ви отримуєте те, що хочете, якщо дозволите своїй оболонці інтерпретувати даний рядок /bin/echo 'test' > /test.txt. Як і у вашому другому редагуванні. Наприклад, якщо ви дозволяєте udevвиконувати touch /test.txtна відміну від того, що ви зробили, ви побачили новий файл у вашому корені.
користувач1146332

Відповіді:


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.