Quitter le forum et retourner au site

Exécution automatique au démontage d’une clé USB

Venez nous en parler, c'est ici que l'on vous conseillera !
Avatar de l’utilisateur
juice
Messages : 247
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Exécution automatique au démontage d’une clé USB

Message par juice »

Bonjour à tous

J’ai la problématique suivante : ma clé usb en fat32 qui contient ma musique en mp3 et que je lis
sur l’autoradio de ma voiture nécessite l’exécution de fatsort pour que les morceaux soient biens
listés dans l’ordre des noms de fichiers et non selon l’ordre d´écriture sur la partition. J’aimerai exécuter
cette commande automatiquement après le démontage du périphérique mais udev ne détecte pas
l’action de démontage ; chose que udisks sait faire. Inversement je je sais pas si udisks sait
gérer des règles comme udev.

Si quelqu’un à une piste je suis preneur…
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

Re: Execution automatique au démontage d’une clé USB

Message par le Manchot Masqué »

Tu es vraiment certain qu'udev ne marche pas ?

Cf. à la fin de http://superuser.com/questions/305723/u ... -insertion, on a bien une action remove qui appelle un script...

Et même sur Arch : cf. https://bbs.archlinux.org/viewtopic.php?id=119111
Avatar de l’utilisateur
juice
Messages : 247
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Re: Execution automatique au démontage d’une clé USB

Message par juice »

Voici ce que je tente pour le moment :

Code : Tout sélectionner

ACTION=="remove", SUBSYSTEMS=="usb" ATTRS{idProduct}=="168a", RUN+="/usr/bin/fatsort -f /dev/disk/by-label/JCC_MUSIC"
Selon moi ça ne marchera pas car le RUN+="…" est exécuté après le remove ce qui est quelque peu problématique. :mrgreen:
Je n’ai pas trouvé comment voir avec udevadm si la commande avait réusssie ou échouée.
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

Re: Execution automatique au démontage d’une clé USB

Message par le Manchot Masqué »

Alors j'ai commencé par un petit script bidon,

Code : Tout sélectionner

$ cat /home/monuser/coucou.sh
#!/bin/bash

/usr/bin/logger COUCOU!
/usr/bin/sort -u /media/macle/aa -o /media/macle/bb
# resultat de la dernière commande (doit être égal à 0 si ok)
/usr/bin/logger $?
avec le fichier /media/macle/aa qui contient 3 lignes à trier:

Code : Tout sélectionner

aa
cc
bb
En lançant /media/macle/aa en ligne de commande, pas de problème : j'ai bien un fichier bb trié à partir de mon fichier source aa !
Ma clé USB étant montée chez moi en /dev/sde, j'ai repéré son idVendor via la commande lsusb.
J'ai ensuite rajouté la règle udev suivante et relancer udev:

Code : Tout sélectionner

$ cat /etc/udev/rules.d/macle.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="048d", MODE="0666", GROUP="plugdev"
KERNEL=="sde1", SUBSYSTEM=="block", ACTION=="remove", RUN+="/home/monuser/coucou.sh"
A noter ici que je ne fais aucune vérification de l'identité de ma clé au niveau du démontage, ce qui est évidemment à proscrire dans une version finale.
J'ai ensuite laissé udev faire son boulot au démontage, via nautilus. Mes logs apparaissent bien dans les journaux système, mais le code de retour de la commande sort (2) laisse à penser que le périphérique est effectivement déjà démonté...
J'ai donc voulu tester un peu plus loin. J'ai commencé par

Code : Tout sélectionner

udevadm info -a -p /sys/block/sde
qui n'était pas assez précis : l'action doit être appelée au niveau de la partition /dev/sde1, et non au niveau du périphérique de bloc /dev/sde. Je suis donc passé à :

Code : Tout sélectionner

udevadm info -a -n /dev/sde1 
pour repérer l'arborescence complète de ma clé USB sous la forme "/devices/pci...sde1"
Puis j'ai testé avec :

Code : Tout sélectionner

udevadm test --action=remove /devices/pci0000:00/0000:00:1d.7/usb4/4-3/4-3.4/4-3.4:1.0/host263/target263:0:0/263:0:0:0/block/sde/sde1
et là effectivement, les lignes

Code : Tout sélectionner

...
udev_node_remove: keeping device node of existing device'/dev/sde1'
...
udevadm_test: run: '/home/monuser/coucou.sh'
...
laisse à penser qu'udev vire les liens existants avant d'appeler le script.
Bref, à moins d'intercepter les événements au niveau noyau avant udev, cette méthode me semble sérieusement compromise. De toute évidence, udev fait bien son boulot, mais il n'a apparemment pas été prévu pour écrire sur une clé en cours de démontage...
Au final, par rapport à ton problème bien spécifique, je crois qu'un petit script maison, avec une petite icône sympa sur le bureau, qui appellerait ta commande de tri et démonterait ensuite la clé, serait beaucoup moins casse-tête.
Avatar de l’utilisateur
juice
Messages : 247
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Re: Execution automatique au démontage d’une clé USB

Message par juice »

Je croit bien que ça finira en quelque chose du genre…
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

Re: Exécution automatique au démontage d’une clé USB

Message par le Manchot Masqué »

Je complète un peu avec les infos suivantes :

Pour avoir toutes les combinaisons possibles d'un appareil (ex : /dev/sdg) :

Code : Tout sélectionner

udevadm info -a -p $(udevadm info -q path -n /dev/sdg)
Et à chaque modification/test dans /etc/udev/monfichier.rules, on recharge les règles UDEV :

Code : Tout sélectionner

udevadm hwdb --update
udevadm control --reload-rules
udevadm trigger
Répondre