2009-10-05 6 views
5

Comment puis-je détecter si un lecteur flash est branché? J'utilise une simple installation Debian, sans aucune interface graphique et je veux être averti dans mon script Python quand un nouveau lecteur flash apparaît ... Je sais que D-BUS distribue ces informations, mais je ne veux pas utiliser D-BUS. Y a-t-il un accès plus simple à cette information? Ne devrait-il pas être disponible sous/proc ou/sys? Comment puis-je me connecter à cette source?Comment puis-je détecter quand un lecteur flash est branché sous Linux?

Bye Falstaff

Répondre

6

Vous pouvez lire uevents from kernel via une prise Netlink et rechercher des événements où "ACTION" est "add" (vous pouvez également regarder si une partition à partir d'un dispositif a été monté ou démonté, ou si un appareil est retiré). C'est aussi proche de la source des événements que l'on peut obtenir dans l'espace utilisateur. Pour autant que je sache, c'est ainsi que udev détecte les médias amovibles insérés.

Mais probablement using D-Bus/HAL API via Python bingings sera beaucoup plus facile (pas d'analyse de données, etc). Je ne sais pas pourquoi vous êtes opposé à cela. Puisque vous utilisez Python, je soupçonne que les ressources ne sont pas vraiment le problème.

+0

Merci! J'essaie votre approche de PeterMmm, je ne sais pas encore si je vais utiliser udev ... Eh bien, j'utilise python pour programmer un prototype sur ma machine, qui n'a pas de problèmes de ressources, mais la destination est un périphérique intégré, où je ne voulez installer tous ces trucs D-Bus/HAL ... – falstaff

0

/proc/partitions montre toutes les partitions connues du noyau.

+0

Oui, mais comment cela aide-t-il à détecter l'événement d'insertion? D'autant plus que toutes les distributions Linux ne se montent pas automatiquement par défaut (bien que la plupart le fassent). – sleske

+0

Même les partitions non montées apparaissent sur/proc/partitions - vous pouvez interroger le fichier. Cependant, la réponse de Peter (udev) est probablement meilleure car udev est là sauf si falstaff utilise un noyau de la série 2.4 – Kimvais

+0

C'est vrai, je n'y ai pas pensé. udev est toujours une meilleure solution, mais si vous devez vous contenter de l'interrogation, cela devrait fonctionner. – sleske

9

Toutes les distributions Linux de maire comprennent udev, qui vous permet d'écrire des scripts personnalisés sur les événements matériels.

1

Lors de la connexion d'un périphérique USB, syslog écrit des messages concernant/var/log/messages. La commande "dmesg" affiche ce journal. Vous pouvez vérifier près de la fin du journal pour voir à quel canal le périphérique a été attaché, il est habituellement/dev/sd (lettre) (nombre) selon les partitions et le nombre de disques série branchés dans le système.

+0

Mais pour que cela fonctionne, vous devriez interroger dmesg, ce qui est très moche (l'interrogation mange des performances et interfère avec la gestion de l'alimentation). – sleske

+0

Je le mentionne attacher à/dev/sd ** ... Bon, de toute façon beaucoup de sondage continue. Le précédent mentionne certains sondages aussi. – whatnick

+0

@whatnick: Oui, c'est pourquoi downvoted au début: - /. – sleske

4

Si vous ciblez un périphérique intégré, vous pouvez exécuter mdev au lieu de udev. Ensuite, vous pouvez écrire des règles mdev qui sont assez simples et qui déclenchent un script.

Bien sûr, vous ne surveillez pas directement votre script, mdev le fait, mais vous pouvez lancer n'importe quelle commande. Vous pouvez probablement faire la même chose avec udev, mais ça m'a toujours paru assez compliqué.

+2

+1 pour ramasser sur la cible incorporée. – whatnick

0

Je l'ai fait en utilisant zenity dans un script et udev à l'article sur RHEL6 avec:

KERNEL == "sd [BD]", DRIVERS == "usb", ACTION == "ajouter", RUN + = "/ path/to/script"

Questions connexes