Je veux exécuter un script lorsque je branche un périphérique sur ma machine Linux. Par exemple, exécutez xinput
sur la souris ou un script de sauvegarde sur un certain lecteur.
J'ai vu beaucoup d'articles à ce sujet, plus récemment ici et ici . Mais je n'arrive pas à le faire fonctionner.
Voici quelques exemples simples essayant d'obtenir au moins une sorte de réponse.
/etc/udev/rules.d/test.rules
#KERNEL=="sd*", ATTRS{vendor}=="*", ATTRS{model}=="*", ATTRS{serial}=="*", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=="add", "SUBSYSTEM=="usb", ATTRS{model}=="My Book 1140 ", ATTRS{serial}=="0841752394756103457194857249", RUN+="/usr/local/bin/test.sh"
#ACTION=="add", "SUBSYSTEM=="usb", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=={add}, RUN+="/usr/local/bin/test.sh"
KERNEL=="sd*", RUN+="/usr/local/bin/test.sh"
KERNEL=="*", RUN+="/usr/local/bin/test.sh"
/usr/local/bin/test.sh
#!/usr/bin/env bash
echo touched >> /var/log/test.log
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
then
echo ${DEVICE} >> /var/log/test.log
fi
Le dossier des règles est surveillé par inotify
et doit être actif immédiatement. Je continue de rebrancher mon clavier, ma souris, ma tablette, mon memorystick et ma clé USB, mais rien. Aucun fichier journal touché.
Maintenant, quelle serait la façon la plus simple de savoir au moins que quelque chose fonctionne? Il est plus facile de travailler à partir de quelque chose qui fonctionne que de quelque chose qui ne fonctionne pas.
udevadm trigger
ou branché un appareil pour appliquer la nouvelle règle?3.5.0-23-generic
.Réponses:
Si vous souhaitez exécuter le script sur un appareil spécifique, vous pouvez utiliser les ID de fournisseur et de produit
Dans
/etc/udev/rules.d/test.rules
:dans
test.sh
:Avec
env
, vous pouvez voir quel environnement est défini depuis udev et avecfile
, vous découvrirez le type de fichier.Les attributs concrets de votre appareil peuvent être découverts avec
lsusb
donne
la source
ACTION=="add",
directement à la définition de règle.Il ne s'agit pas directement de votre question mais de ce que vous faites. Si vous démarrez un script de sauvegarde depuis udev, vous serez confronté à deux problèmes principaux:
Mon conseil est de créer un script dans votre home utilisateur qui écoutera un canal nommé et qui sera démarré de manière asynchrone comme:
Remarque: J'utilise le montage automatique avec kde donc je vérifie que le dossier apparaît. Vous pouvez passer le paramètre / dev / sd * dans le fifo à partir de la règle udev et le monter vous-même dans le script. Pour écrire dans le fifo, n'oubliez pas que udev n'est pas un shell et que la redirection ne fonctionne pas. Votre RUN doit ressembler à:
RUN + = "/ bin / sh -c '/ bin / echo connecté >> / tmp / IomegaUsbPipe'"
la source
J'ai publié une solution sur /ubuntu//a/516336 et je copie également la solution ici.
J'ai écrit un script Python en utilisant pyudev que je laisse tourner en arrière-plan. Ce script écoute les événements udev (donc il est très efficace) et exécute le code que je veux. Dans mon cas, il exécute des
xinput
commandes pour configurer mes appareils ( lien vers la version la plus récente ).Voici une version courte du même script:
la source
call()
. De cette façon, s'il est nécessaire de fournir des arguments aufoobar.sh
script, vous pouvez le faire dynamiquement.Pour exécuter le script au démarrage lorsque le périphérique USB est inséré, j'utilise la solution ci-dessous:
Formatez la clé USB ou tout autre stockage USB et donnez-lui un nom lors de cette opération. Puis dans la
/etc/rc.local
ligne d'ajoutls -q /dev/disk/by-label > /home/pi/label.txt
il créera un fichier txt appelé label.txt (peut être tout autre nom)
puis à nouveau dans /etc/rc.local, ajoutez 2 autres lignes:
Maintenant, chaque fois qu'une clé USB portant le nom USB_drive_name est insérée, le script s'exécute.
Avec quelques petites modifications ci-dessus, la solution peut être utilisée lorsque le système est opérationnel.
la source
udev
pour d'autres moments ne sont pas «quelques petites modifications») et le Raspberry Pi. Il existe un problème inutilesudo
-rc.local
s'exécute en tant que root, c'est un problème d'élévation de privilèges - un fichier modifiable par un utilisateur normal est exécuté en tant que root.