udev

4 réponses
Avatar
Pascal
Bonjour
je souhaite lancer un script dès le branchement d'un disque dur usb.
J'ai testé moults règles udev trouvées sur le net sans succès..
Pas moyen de faire "matcher" cette règle.
Quelqu'un pourait t'il me mettre sur la piste ?

Voilà entre autres essais comment j'ai fait :

Localiser le "device path" avec la commande lsusb

Bus 008 Device 003: ID 0461:4d81 Primax Electronics, Ltd
Bus 008 Device 002: ID 045e:0750 Microsoft Corp. Wired Keyboard 600
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 020: ID 1058:0704 Western Digital Technologies, Inc. Passport
External HDD
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Le périphérique concerné :
Bus 001 Device 020: ID 1058:0704 Western Digital Technologies, Inc. Passport
External HDD

Informations concernant ce périphérique
udevadm info -a --attribute-walk --root --name=/dev/bus/usb/001/020

looking at device '/devices/pci0000:00/0000:00:1a.7/usb1/1-1':
KERNEL=="1-1"
SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{configuration}==""
ATTR{bNumInterfaces}==" 1"
ATTR{bConfigurationValue}=="1"
ATTR{bmAttributes}=="c0"
ATTR{bMaxPower}==" 2mA"
ATTR{urbnum}=="1755"
ATTR{idVendor}=="1058"
ATTR{idProduct}=="0704"
ATTR{bcdDevice}=="0175"
ATTR{bDeviceClass}=="00"
ATTR{bDeviceSubClass}=="00"
ATTR{bDeviceProtocol}=="00"
ATTR{bNumConfigurations}=="1"
ATTR{bMaxPacketSize0}=="64"
ATTR{speed}=="480"
ATTR{busnum}=="1"
ATTR{devnum}=="20"
ATTR{version}==" 2.00"
ATTR{maxchild}=="0"
ATTR{quirks}=="0x0"
ATTR{authorized}=="1"
ATTR{manufacturer}=="Western Digital "
ATTR{product}=="External HDD "
ATTR{serial}=="57442D575843383038343737383934"
.../...

La règle que j'ajoute dans le fichier /etc/udev/rules.d/85-regles.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="1058",
ATTR{serial}=="57442D575843383038343737383934",RUN+="/usr/bin/gedit"

On recharge les règles
udevadm control --reload-rules

Au branchement du disque usb, rien ne se passe et rien dans syslog

Merci pour votre aide

4 réponses

Avatar
moi-meme
Le Thu, 13 Sep 2012 17:26:09 +0200, Pascal a écrit :


SUBSYSTEM=="usb", ATTR{idVendor}=="1058",
ATTR{serial}=="57442D575843383038343737383934",RUN+="/usr/bin/gedit"



AMHA (je ne suis pas un dieu là dedans) le disque ça devrait le monter où
ta règle UDEV ?
Avatar
Francois Lafont
Bonjour,

Le 13/09/2012 17:26, Pascal a écrit :

je souhaite lancer un script dès le branchement d'un disque dur usb.
J'ai testé moults règles udev trouvées sur le net sans succès..
Pas moyen de faire "matcher" cette règle.
Quelqu'un pourait t'il me mettre sur la piste ?



[...]

Au branchement du disque usb, rien ne se passe et rien dans syslog



Merci Pascal d'avoir décrit précisément la procédure. Je viens de faire
le test sur ma Debian Squeeze et, comme toi, rien ne se passe. En
revanche (et c'est ça qui est intéressant), si je remplace ta règle par :

SUBSYSTEM=="usb", ATTR{idVendor}=="xxx", ATTR{serial}=="xxx",
RUN+="/home/francois/unscript"

où le script contient ça :

#--------------------------
#!/bin/bash

echo "TEST" >> "/home/francois/Bureau/out"
#--------------------------

autrement dit un script qui ne fait pas intervenir l'interface graphique
alors ça fonctionne. Du coup, je pense la procédure est globalement
correcte mais que c'est l'environnement d'exécution de la commande
/usr/bin/gedit qui n'est pas bon.

J'avais espéré qu'un truc comme :

SUBSYSTEM=="usb",ATTR{idVendor}=="0781",ATTR{serial}=="445671168F907F84",RUN+="DISPLAY=:0
/usr/bin/gedit"

puisse fonctionner mais il n'en est rien.

Attention, dans la page man de udev (que j'ai très vite parcouru), on
peut lire : « RUN : Add a program to the list of programs to be
executed for a specific device. This can only be used for very short
running tasks. Running an event process for a long period of time may
block all further events for this or a dependent device. »


--
François Lafont
Avatar
Pascal
Merci Pascal d'avoir décrit précisément la procédure. Je viens de faire
le test sur ma Debian Squeeze et, comme toi, rien ne se passe. En
revanche (et c'est ça qui est intéressant), si je remplace ta règle par :

SUBSYSTEM=="usb", ATTR{idVendor}=="xxx", ATTR{serial}=="xxx",
RUN+="/home/francois/unscript"



Bonjour,
Alors j'ai modifié ma règle comme toi en mettant à la place un petit script :
pas mieux
En exécutant cette commande udevadm info -a -p /sys/block/sdc/sdc1/ plutot que
celle la : udevadm info -a --attribute-walk --root --name=/dev/bus/usb/001/020
je me rend compte que la règle devrait plutot être écrite de la sorte
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1058",
ATTRS{serial}=="57442D575843383038343737383934",RUN+="/home/pascal/Bureau/test.sh"

les "S" en plus mais pas mieux
dans syslog aucune trace de cette règle


Merci tout de même
Avatar
Pascal
-------- Message original --------

Bonjour,

Le 13/09/2012 17:26, Pascal a écrit :

je souhaite lancer un script dès le branchement d'un disque dur usb.
J'ai testé moults règles udev trouvées sur le net sans succès..
Pas moyen de faire "matcher" cette règle.
Quelqu'un pourait t'il me mettre sur la piste ?



[...]

Au branchement du disque usb, rien ne se passe et rien dans syslog



Merci Pascal d'avoir décrit précisément la procédure. Je viens de faire
le test sur ma Debian Squeeze et, comme toi, rien ne se passe. En
revanche (et c'est ça qui est intéressant), si je remplace ta règle par :

SUBSYSTEM=="usb", ATTR{idVendor}=="xxx", ATTR{serial}=="xxx",
RUN+="/home/francois/unscript"

où le script contient ça :

#--------------------------
#!/bin/bash

echo "TEST">> "/home/francois/Bureau/out"
#--------------------------

autrement dit un script qui ne fait pas intervenir l'interface graphique
alors ça fonctionne. Du coup, je pense la procédure est globalement
correcte mais que c'est l'environnement d'exécution de la commande
/usr/bin/gedit qui n'est pas bon.

J'avais espéré qu'un truc comme :

SUBSYSTEM=="usb",ATTR{idVendor}=="0781",ATTR{serial}=="445671168F907F84",RUN+="DISPLAY=:0
/usr/bin/gedit"

puisse fonctionner mais il n'en est rien.

Attention, dans la page man de udev (que j'ai très vite parcouru), on
peut lire : « RUN : Add a program to the list of programs to be
executed for a specific device. This can only be used for very short
running tasks. Running an event process for a long period of time may
block all further events for this or a dependent device. »




Bon pour info, il suffit de configurer udev pour le rendre plus verbeux
nano /etc/udev/udev.conf
udev_log="info"

Du coup lorsque mon script lance gedit je peux constater que :
Gtk-WARNING **: cannot open display: '


héhé

merci pour ton aide