Existe-t-il un moyen d'activer automatiquement un script lorsqu'un périphérique USB se connecte?


12

J'ai un périphérique USB (caméra POV) qui recueille beaucoup de données et remplit régulièrement son stockage. Le but est d'écrire un script qui:

  1. Écoute l'appareil pour se connecter via USB
  2. Le monte comme périphérique de stockage
  3. Télécharge les données de l'appareil
  4. Démonte en toute sécurité l'appareil pour le retrait (à la fin du téléchargement)

Je peux ajouter au script plus tard l'option de clignotement des LED attachées à certaines broches du GPIO pour indiquer l'état ...

J'ai cherché "comment télécharger automatiquement les données d'un périphérique USB" sur Ubuntu et d'autres sites Linux, mais sans résultat. Quelqu'un peut-il fournir un point de départ? Je suis à l'aise avec l'écriture de code à partir de documentation et d'exemples.

Réponses:


13

Utilisez les règles udev .

trouver les informations de votre appareil.

udevadm -a -p /dev/path/device/

KERNELS=="1-3"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
...
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="SANDisk"
ATTRS{product}=="USB DISK"
ATTRS{serial}=="SD71011000019113"

Créez ensuite votre fichier de règles udev pour votre appareil. Lors de la création d'un fichier de règles, utilisez les informations que vous avez obtenues de la commande udevinfo.

contenu de /etc/udev/rules.d/99-mydevice.rules

SUBSYSTEMS=="usb", ATTRS{serial}=="SD71011000019113", RUN+="/home/gurcan/sync.sh"

Créez votre script qui s'exécutera en tant que périphérique USB connecté

#!/bin/bash
#
rsync -avz /media/disk/photos/ /data/photos/

Recharger les règles udev

udevcontrol reload_rules

Essaye-le. débrancher / brancher


1
J'ai essayé d'exécuter udevinfo, mais j'ai obtenu une -bash: udevinfo: command not foundréponse du shell ssh. J'ai vérifié manet il y a une manentrée pour udev, mais pas pour udevinfo. J'essaierai probablement de poursuivre avec udev... votre réponse a été utile, alors merci! Je vais regarder autour de udevinfomoi aussi, peut-être que je n'ai pas installé de référentiel ou quelque chose.
user3.1415927

1
@ user3.1415927 En raison du remplacement d'udevinfo par udevadm dans debian, j'ai mis à jour ma réponse.
gurcanozturk

2

Si vous n'aimez pas udev, vous pouvez jeter un œil à devmon .

Il permet ces options:

--exec-on-device DEVICE "COMMAND" Execute COMMAND after mounting DEVICE --exec-on-label "LABEL" "COMMAND" Execute COMMAND after mounting LABEL --exec-on-video "COMMAND" Execute COMMAND after video DVD mount --exec-on-audio "COMMAND" Execute COMMAND after audio CD insertion --exec-on-disc "COMMAND" Execute COMMAND after data CD/DVD mount --exec-on-drive "COMMAND" Execute COMMAND after drive mount --exec-on-unmount "COMMAND" Execute COMMAND after unmount --exec-on-remove "COMMAND" Execute COMMAND after drive removal Where the following in COMMAND will be replaced with: %d mount point directory (eg /media/cd) %f device name (eg /dev/sdd1) %l label of mounted volume Multiple --exec-on-XXX options may be used to execute multiple commands. Other exec-on-XXX commands are ignored if exec-on-device or -label executed.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.