¿Cómo verificar si se disparó una regla de udev?

15

Estoy tratando de familiarizarme con udev, en Ubuntu 13.10.

Aquí está mi primera regla simple 95.usbbackup.rules:

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

y aquí está el script (que ha sido modificado + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

No ocurre nada cuando conecto unidades externas. ¿Cómo puedo verificar (un registro, un comando, cualquier cosa) si la regla se disparó?

Muchas gracias

pouzzler
fuente
2
Creo que te refieres SUBSYSTEMS=="usb". Es decir, el doble ==que prueba la igualdad en lugar del único =que asigna un valor a una clave.
Lqueryvg

Respuestas:

5

Estoy bastante seguro de que esto debería funcionar. ¿Recargó sus reglas de udev después de editar sus reglas?

udevadm control --reload-rules && udevadm trigger como raíz

Redsandro
fuente
Hice una regla más estrecha: KERNEL == "sdb", que funciona. ¿Udev solo trata las reglas que identifican algunos hardware de forma exclusiva?
Pouzzler
No, intente KERNEL!="sdz*"y debería obtener todo (excepto sdz [1-9])
Redsandro
55
Esto realmente no responde la pregunta. ¿Cómo sabes si las reglas se activaron?
DanielSank
1
Lo sabes porque el script se ejecuta. Puede hacerlo escribir en un archivo de registro. Tambiénudevadm monitor
Redsandro
2

Puede dar un comando como root como este:

monitor udevadm

Se mostrará cuando se haya activado una regla.

usuario2703782
fuente
11
udevadm monitorsolo muestra los eventos de udev, pero no si se activó una regla correspondiente. Sin embargo, puede buscar el evento que debe activar la regla, pero luego no sabe si su regla funciona.
F.Raab
2

Estoy ejecutando el kernel 3.0.35, pero lo siguiente funciona para mí.

Para obtener la ruta del dispositivo, puede hacer algo como esto:

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

Obtendrá más información de la que necesita, pero le interesa el DEVPATH. Luego, para ver qué reglas de udev se ejecutan, ejecute esto:

udevadm test DEVPATH

No creo que esto realmente ejecute las reglas, la documentación dice que 'simula' los eventos para el dispositivo dado. Para obtener más información, consulte esta página de manual: https://www.freedesktop.org/software/systemd/man/udevadm.html

JSunderland
fuente
1

Con udev / systemd versión 241 y similar, como root:

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

O para hacerlo permanente, nuevamente como root:

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

PD: la respuesta incorrecta más frecuente pero en mi humilde opinión se parece a:

udevadm -d test / devices / where / is / my / device | y menos

... pero esto tiene varios problemas. Los principales:

  • where/is/my/device? Tedioso, complicado y propenso a errores.

  • Al comparar las respuestas anteriores con la salida reciente de udev versión 241, udevadm testparece mostrar menos información que antes.

  • udevadm -d test es solo una simulación ! Cada vez que advierte:

    Este programa es solo para depuración, no ejecuta ningún programa especificado por una tecla RUN. Puede mostrar resultados incorrectos, porque algunos valores pueden ser diferentes o no estar disponibles en una ejecución de simulación.

udevadm test es para desarrollar una nueva regla, no es para solucionar problemas de reglas rotas, faltantes o anuladas.

Marzo
fuente
0

Estaba teniendo el mismo problema con Raspberry Pi 3 B +. Intenté invocar un script al insertar un dispositivo de almacenamiento USB. Las reglas no se registran en syslog, por lo que se hace muy difícil entender qué regla funcionó o qué falló.

Entonces hice lo siguiente:

  1. Hice mi archivo de reglas en /etc/udev/rules.d/100-myrule.rules
  2. Entonces ejecuté el comando sudo /etc/init.d/udev restart

y cuando revisé, funcionó.

Una información, que puede o no ser útil, es que los sistemas de archivos son de solo lectura para udev hasta que se ejecute el comando en el paso 2.

MSharq
fuente
0

udevadm test $(udevadm info --query=path --name=device_name)debería decirle qué comandos se ejecutarían en un dispositivo conectado, citando las udevreglas involucradas. Por ejemplo:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
Dmitry Grigoryev
fuente