Comment exécuter un script lorsqu'un lecteur flash spécifique est monté?

44

Existe-t-il un moyen d'exécuter un script lorsqu'un périphérique USB particulier est monté?

Je conserve mes vidéos sur un port USB distinct et souhaite exécuter un script permettant de monter le dossier vidéo du périphérique USB sur celui du dossier de base.

    
posée Braiam 06.02.2011 - 22:00
la source

7 réponses

28

Commencez par trouver votre appareil dans lsusb . Notez l'ID (par exemple 0a81:0101 )

Créez un nouveau fichier de règles udev dans /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rules et insérez une nouvelle règle comme ceci:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Notez comment j'ai utilisé l'ID de lsusb .

Ensuite, il vous suffit d'écrire le script pour faire le travail. Une commande de montage simple devrait fonctionner. Vous pourriez avoir besoin d'une commande sleep 5 pour attendre que le système de fichiers s'initialise (si vous laissez gnome faire le montage principal - mais que vous êtes libre de le monter d'abord et que vous n'auriez peut-être pas besoin de sommeil). p>

Ajout d'Allan: Les scripts longs peuvent bloquer "tous les événements supplémentaires pour ce périphérique ou un périphérique dépendant". Ma page de manuel Mint indique en outre que "Les tâches longues doivent être immédiatement détachées du processus événementiel". Aucune astuce n'est donnée pour savoir où acquérir les compétences pour le faire.

Réponse de Oli: Emballez-le comme suit: lien

    
réponse donnée Oli 07.02.2011 - 00:54
la source
23

La solution avec systemd est bien meilleure maintenant. Vous créez un service qui dépend et est recherché par vos médias, par exemple: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Ensuite, vous devez démarrer / activer le service:
sudo systemctl start your.service
sudo systemctl enable your.service

Après le montage systemd déclenche votre script de déclenchement. L'avantage par rapport à la règle udev est que le script se déclenche vraiment après le montage, et non après l'ajout d'un périphérique système.

Cas d'utilisation : j'ai une partition cryptée que je veux sauvegarder automatiquement. Après avoir ajouté l'appareil, je dois saisir le mot de passe. Si j'ai connecté le script de sauvegarde à udev, le script tente de s'exécuter au moment où je saisis le mot de passe, ce qui échouera.

Ressource: Création de scripts avec udev

Remarque: vous pouvez trouver votre unité avec: sudo systemctl list-units -t mount

    
réponse donnée sumid 29.09.2015 - 10:51
la source
8

Une autre façon d’obtenir les valeurs pour ATTRS {idVendor} et ATTRS {idProduct} (testées dans Ubuntu 12.04) est la suivante:

  1. Trouvez où votre USB est monté:

    $ mount | grep /dev/sd*
    

    cela montre quelque chose comme ceci:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Utilisez udevadm pour obtenir les informations sur ce périphérique:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    la sortie devrait être quelque chose comme:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Utilisez maintenant l'identifiant du modèle pour ATTRS {idProduct} et l'ID du fournisseur pour ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
réponse donnée emont01 19.09.2012 - 01:11
la source
1

Dans Nautilus sous Edit & gt; Preferences & gt; Media, vous pouvez choisir "other action" et "costum command". pour différents types de médias à exécuter. À ce moment-là, le lecteur USB est déjà monté, mais je suppose que vous pouvez toujours le lier (avec une commande costum) au dossier dans lequel vous souhaitez que le lecteur apparaisse. Je ne pouvais pas dire si c'est plus facile ou mieux que d'utiliser udev.

    
réponse donnée bacon 06.02.2011 - 23:53
la source
1

Si vous ne voulez pas interférer avec votre gestionnaire de fichiers (nautilus, konquerer, gnome, etc.) sur le montage et le démontage de votre périphérique, je suggère de ne pas utiliser la route udev.

Au lieu de cela, utilisez udisks-glue si votre système utilise des udisks (presque tous le font).

Après l’installation, créez simplement un fichier de configuration ~/.udisks-glue.conf dans votre répertoire personnel comme celui-ci.

Mon exemple suivant met à jour les données GPS-Assist sur mon appareil photo chaque fois que je branche la carte SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Ensuite, assurez-vous que udisks-glue démarre lorsque vous démarrez ou que vous vous connectez. C'est à dire. via les applications de démarrage de gnome

    
réponse donnée xro 24.11.2014 - 04:10
la source
0

utiliser udev

lien

    
réponse donnée user10333 06.02.2011 - 22:11
la source
0
La réponse de

@ sumid a un problème. Vous devez ne pas démarrer le service. Vous devez juste l'activer.

fichier: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Activez ensuite le service:

sudo systemctl enable your.service

C'est tout.

Remarque: vous pouvez trouver votre étiquette médiane avec: sudo systemctl list-units -t mount

Remarque2: Si le service échoue d’une manière ou d’une autre (par exemple, le script n’est pas exécutable), votre point de montage sera remplacé par <old_mount_point_name>1 la prochaine fois que vous monterez le périphérique USB. Pour résoudre ce problème, il vous suffit d'exécuter sudo systemctl reset-failed

    
réponse donnée sgon00 11.12.2017 - 11:57
la source

Lire d'autres questions sur les étiquettes