Próbowałem użyć, udev
aby system Debian uruchomił skrypt bash po podłączeniu karty bezprzewodowej.
Do tej pory utworzyłem ten plik /etc/udev/rules.d/wifi-detect.rules
:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"
Na razie staram się, aby test.sh
ta zawartość działała:
#!/bin/bash
/bin/echo "test!" > /test.txt
Ale z jakiegoś powodu nic nie dzieje się po podłączeniu karty sieci bezprzewodowej, żaden test.txt
plik nie jest tworzony.
Moje lsusb
na karcie:
Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
Uruchomienie udevadm monitor –env
tego dzieje się po podłączeniu karty:
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)
Próbowałem wielu przykładów, ale nie mogę sprawić, żeby działało. Mam nadzieję, że ktoś może mi w tym pomóc;) Dziękuję!
EDYTOWAĆ:
Aby uprościć sprawę, zmieniłem zasadę na:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"
Udało mi się ustawić udevadm control --log-priority=info
zgodnie z sugestią @ user1146332 i otrzymałem ten interesujący dziennik:
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
Więc ... Czy return code 0
kod wyjścia nie jest zakończony powodzeniem? Jeśli tak, dlaczego nie otrzymuję żadnego pliku w systemie?
EDYCJA 2:
Udało mi się to uruchomić za pomocą wskazówki @htor. Moja obecna zasada:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"
Ale z jakiegoś powodu polecenie jest wykonywane 8 razy, czy istnieje sposób, aby tego uniknąć? Wydaje mi się, że tak się dzieje, ponieważ kiedy sterowniki karty bezprzewodowej są ładowane, muszą praktycznie odmontować i zamontować kartę. Porady
źródło
/bin/echo
został wykonany pomyślnie, jak sugeruje Twój dziennik. Dane wyjściowe polecenia sątest > /test.txt
zgodne ze stanem dziennika. Powodem tego jest to, że postać>
nie ma żadnego specjalnego znaczenia w twoim kontekście. To tylko trzeci argument wiersza poleceń, który przekazałeśecho
. Dostajesz to, co chcesz, jeśli pozwalasz swojej powłoce interpretować podaną linię/bin/echo 'test' > /test.txt
. Tak jak podczas drugiego EDYCJI. Na przykład, jeśli pozwolisz naudev
wykonanietouch /test.txt
w przeciwieństwie do tego, co zrobiłeś, zobaczysz nowy plik w katalogu głównym.Odpowiedzi:
Miałem podobny problem jakiś czas temu i rozwiązaniem była zmiana
RUN+=
części naRUN+="sh -c '/root/test.sh'"
. Teraz nie wiem, czy potrzebujesz tego w tym przypadku, ponieważ reguła wywołuje skrypt, a nie polecenie.Kolejna obserwacja: spróbuj usunąć ciąg
!
z"test!"
ciągu lub zastąp podwójne cudzysłowy pojedynczymi cudzysłowami. Wybuch!
prawdopodobnie sprawia kłopoty ze względu na swoje specjalne znaczenie w powłoce, a podwójne cudzysłowy zachowują to znaczenie.źródło
!
nie działa.RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"
działa, ale z jakiegoś powodu dostałem „test” zapisany 8 razy w pliku. Wygląda na to, że polecenie jest wykonywane wielokrotnie: SRadzę ustawić priorytet rejestrowania
udev
oderr
doinfo
zJeśli chcesz zobaczyć jeszcze więcej informacji, ustaw je na
debug
. Teraz możesz znaleźć bardzo szczegółowe informacje o tym, coudev
się stało/var/log/daemon.log
(przynajmniej w systemie związanym z Debianem). Ogólnie pomaga to w bardzo częstych błędach.To tylko uzupełnienie odpowiedzi htor, która prawdopodobnie rozwiązuje twój problem.
źródło