Jak sprawdzić, czy zadziałała reguła udev?

16

Próbuję zapoznać się z udev, pod Ubuntu 13.10.

Oto moja pierwsza prosta reguła 95.usbbackup.rules:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

a oto skrypt (który został chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Po podłączeniu dysków zewnętrznych nic się nie dzieje. Jak mogę sprawdzić (dziennik, polecenie, cokolwiek), czy reguła została uruchomiona?

Wielkie dzięki

nalewak
źródło
2
Myślę, że masz na myśli SUBSYSTEMS=="usb". Tj. Podwójna, ==która sprawdza równość zamiast pojedynczej, =która przypisuje wartość do klucza.
Lqueryvg

Odpowiedzi:

5

Jestem pewien, że to powinno zadziałać. Czy przeładowałeś swoje reguły udev po edycji reguł?

udevadm control --reload-rules && udevadm trigger jako root.

Redsandro
źródło
Wprowadziłem węższą zasadę: KERNEL == "sdb", która działa. Czy udev traktuje tylko reguły, które jednoznacznie identyfikują niektóre urządzenia?
pouzzler
Nie, spróbuj KERNEL!="sdz*"i powinieneś dostać wszystko (z wyjątkiem sdz [1-9])
Redsandro
5
To tak naprawdę nie odpowiada na pytanie. Skąd wiesz, czy reguły się uruchomiły?
DanielSank,
1
Wiesz, ponieważ skrypt jest uruchomiony. Możesz zmusić go do zapisu do pliku dziennika. Równieżudevadm monitor
Redsandro,
3

Możesz wydać komendę jako root:

monitor udevadm

Pokaże, kiedy reguła została uruchomiona.

użytkownik2703782
źródło
11
udevadm monitorpokazuje tylko zdarzenia udev, ale nie, jeśli uruchomiona została odpowiednia reguła. Możesz jednak poszukać zdarzenia, które powinno uruchomić regułę, ale nie wiesz, czy reguła działa.
F.Raab
2

Korzystam z jądra 3.0.35, ale następujące działa dla mnie.

Aby uzyskać ścieżkę do urządzenia, możesz zrobić coś takiego:

udevadm info --name /dev/sda1 --query all

Otrzymasz więcej informacji, niż potrzebujesz, ale interesuje Cię DEVPATH. Następnie, aby zobaczyć, jakie reguły udev są wykonywane, uruchom to:

udevadm test DEVPATH

Nie sądzę, że to faktycznie wykonuje reguły, dokumentacja mówi, że to „symuluje” zdarzenia dla danego urządzenia. Aby uzyskać więcej informacji, sprawdź tę stronę podręcznika : https://www.freedesktop.org/software/systemd/man/udevadm.html

JSunderland
źródło
1

Z udev / systemd wersją 241 i podobną, jako root:

udevadm control --log-priority=debug
journalctl -f

Lub uczynić go stałym, ponownie jako root:

vi /etc/udev/udevd.conf
systemctl restart systemd-udevd
journalctl -f

PS: najczęstsza, ale błędna odpowiedź IMHO wygląda następująco:

udevadm -d test / devices / where / is / my / device | & less

... ale ma to wiele problemów. Główne:

  • where/is/my/device? Nużący, skomplikowany i podatny na błędy.

  • Porównując stare odpowiedzi z najnowszymi udevadm testdanymi wyjściowymi wersji udev 241, wydaje się , że pokazuje mniej informacji niż kiedyś.

  • udevadm -d test to tylko symulacja ! Za każdym razem, gdy ostrzega:

    Ten program służy wyłącznie do debugowania, nie uruchamia żadnego programu określonego za pomocą klawisza RUN. Może wyświetlać niepoprawne wyniki, ponieważ niektóre wartości mogą być inne lub niedostępne w przebiegu symulacji.

udevadm test służy do opracowywania nowej reguły, nie służy do rozwiązywania problemów z łamanymi, brakującymi lub zastępowanymi regułami.

Marsz
źródło
0

Miałem ten sam problem z Raspberry Pi 3 B +. Próbowałem wywołać skrypt po włożeniu urządzenia pamięci USB. Reguły nie są rejestrowane w syslog, więc bardzo trudno jest zrozumieć, która reguła zadziałała, a która reguła zawiodła.

Zrobiłem więc:

  1. Plik reguł utworzyłem w /etc/udev/rules.d/100-myrule.rules
  2. Potem uruchomiłem polecenie sudo /etc/init.d/udev restart

a kiedy sprawdziłem, zadziałało.

Informacje, które mogą, ale nie muszą być przydatne, to to, że systemy plików są odczytywane tylko dla udev, dopóki polecenie w kroku 2 nie zostanie wykonane.

MSharq
źródło
0

udevadm test $(udevadm info --query=path --name=device_name)Należy powiedzieć, które polecenia będą wykonywane na wtyczce urządzenia w, powołując się na udevprzepisy związane. Na przykład:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
Dmitrij Grigoriew
źródło