J'essaie de configurer un script à exécuter chaque fois que je branche un périphérique USB. J'ai créé le fichier /etc/udev/rules.d/90-local.rules et ajouté la règle suivante:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
Le problème est que lorsque le lecteur est connecté, rien ne se passe. Le script, à des fins de débogage, est truqué pour envoyer une notification avec notify-send, qui est installé et fonctionne correctement à partir du terminal.
Le chemin d'accès au script est correct, car j'ai exécuté cette commande exacte dans le terminal sans aucun problème.
Réponses:
J'ai eu le même problème. Cela a fonctionné pour moi:
Essayez de copier votre script dans
/usr/local/bin
et modifiez le répertoire de votre.rules
fichier.De plus, je ne sais pas ce qu'est SYSFS, mais je préférerais utiliser les propriétés ATTR.
La ligne suivante est le contenu de mon
.rules
fichier:la source
ATTRS{vendor}=="SanDisk "
partie cela signifie-t-il que seulSandisk
sera détecté?notify-send
nécessite l'accès à votre bus de session DBus, qu'il ne peut pas avoir pour deux raisons:Aucune information sur la session. Lorsqu'il est démarré par udev, votre script ne sait pas où vous êtes connecté ou si vous êtes connecté du tout. Multi-siège avec X11 est toujours délicat, mais le changement d'utilisateur fonctionne pour les sessions X11 et console. De nombreuses personnes utilisent également SSH, VNC et NX sur le réseau.
(
DISPLAY=:0
Cela fonctionnerait la moitié du temps, mais c'est toujours au mieux deviner .)Refusé par la politique DBus. Même si votre script trouve en quelque sorte votre session X11, il ne pourra pas envoyer de notifications en raison de l'exécution du script au
root
lieu de votre compte d'utilisateur.la source
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;
a fait l'affaire pour moi avec notify-sendVous pouvez essayer de faire correspondre le périphérique par ID de fournisseur et de produit à la place. La règle personnalisée suivante fonctionne pour moi:
Vous pouvez voir idVendor et idProduct dans la sortie lsusb ou dmesg après avoir connecté le périphérique.
la source
Suite à la réponse d'Aleh: Si vous souhaitez également surveiller les
remove
événements, vous devez rechercher une variable d'environnement nomméeID_SERIAL
. Il contient l'ID du fournisseur et du produit séparé par un trait de soulignement:La règle est désormais également plus courte.
la source
Peut-être, vous devrez peut-être ajouter un
sleep
dans le script, pour donner au périphérique USB une chance de "s'installer"? Par exemple, les modems usb 3g, le changement de mode pour obtenir un / dev / ttyUSB pour être lancé et exécuté par le noyau.la source
Essayez de remplacer SUBSYSTEM = "usb" par SUBSYSTEMS = "usb"
la source
SUBSYSTEM=="usb"
c'est très bien.