Comment vérifier si une règle udev s'est déclenchée?

16

J'essaie de me familiariser avec udev, sous Ubuntu 13.10.

Voici ma première règle simple 95.usbbackup.rules:

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

et voici le script (qui a été chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Rien ne se passe du tout lorsque je branche des disques externes. Comment puis-je vérifier (un journal, une commande, quoi que ce soit) si la règle a été déclenchée?

Merci beaucoup

pouzzler
la source
2
Je pense que tu veux dire SUBSYSTEMS=="usb". C'est-à-dire double ==qui teste l'égalité plutôt que simple =qui attribue une valeur à une clé.
Lqueryvg

Réponses:

5

Je suis sûr que cela devrait fonctionner. Avez-vous rechargé vos règles udev après avoir modifié vos règles?

udevadm control --reload-rules && udevadm trigger en tant que root.

Redsandro
la source
J'ai fait une règle plus étroite: KERNEL == "sdb", qui fonctionne. Udev ne traite-t-il que les règles qui identifient certains matériels de manière unique?
pouzzler
Non, essayez KERNEL!="sdz*"et vous devriez tout obtenir (sauf sdz [1-9])
Redsandro
5
Cela ne répond pas vraiment à la question. Comment savez-vous si les règles se sont déclenchées?
DanielSank
1
Vous le savez parce que le script est exécuté. Vous pouvez le faire écrire dans un fichier journal. Aussiudevadm monitor
Redsandro
2

Vous pouvez donner une commande en tant que root comme ceci:

moniteur udevadm

Il montrera quand une règle a été déclenchée.

user2703782
la source
11
udevadm monitoraffiche simplement les événements udev, mais pas si une règle correspondante a été déclenchée. Cependant, vous pouvez rechercher l'événement qui doit déclencher la règle, mais vous ne savez pas si votre règle fonctionne.
F.Raab
2

J'utilise le noyau 3.0.35, mais ce qui suit fonctionne pour moi.

Pour obtenir le chemin de l'appareil, vous pouvez faire quelque chose comme ceci:

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

Vous obtiendrez plus d'informations que nécessaire, mais vous êtes intéressé par le DEVPATH. Ensuite, pour voir quelles règles udev sont exécutées, vous exécutez ceci:

udevadm test DEVPATH

Je ne pense pas que cela exécute réellement les règles, la documentation dit que cela «simule» les événements pour le périphérique donné. Pour obtenir plus d'informations, consultez cette page de manuel: https://www.freedesktop.org/software/systemd/man/udevadm.html

JSunderland
la source
1

Avec udev / systemd version 241 et similaire, en tant que root:

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

Ou pour le rendre permanent, encore une fois en tant que root:

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

PS: la mauvaise réponse la plus fréquente mais à mon humble avis ressemble à:

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

... mais cela pose un certain nombre de problèmes. Les principaux:

  • where/is/my/device? Fastidieux, compliqué et sujet aux erreurs.

  • La comparaison des anciennes réponses à la sortie récente de la version 241 d'udev udevadm testsemble montrer moins d'informations qu'auparavant.

  • udevadm -d test n'est qu'une simulation ! Chaque fois qu'il avertit:

    Ce programme est destiné au débogage uniquement, il n'exécute aucun programme spécifié par une clé RUN. Il peut afficher des résultats incorrects, car certaines valeurs peuvent être différentes ou non disponibles lors d'une simulation.

udevadm test sert à développer une nouvelle règle, pas à dépanner des règles brisées, manquantes ou remplacées.

Mars
la source
0

J'avais le même problème avec Raspberry Pi 3 B +. J'essayais d'invoquer un script lors de l'insertion d'un périphérique de stockage USB. Les règles ne sont pas enregistrées dans syslog, il devient donc très difficile de comprendre quelle règle a fonctionné ou quelle règle a échoué.

J'ai donc fait ce qui suit:

  1. J'ai créé mon fichier de règles dans /etc/udev/rules.d/100-myrule.rules
  2. Ensuite, j'ai exécuté la commande sudo /etc/init.d/udev restart

et quand j'ai vérifié, ça a marché.

Une information, qui peut être utile ou non, est que les systèmes de fichiers sont en lecture seule pour udev jusqu'à ce que la commande de l'étape 2 soit exécutée.

MSharq
la source
0

udevadm test $(udevadm info --query=path --name=device_name)devrait vous dire quelles commandes seraient exécutées sur un plug-in de périphérique, en citant les udevrègles impliquées. Par exemple:

# 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
la source