2009-10-05 13 views
5

¿Cómo puedo detectar cuando una unidad flash está enchufada? Estoy usando una instalación Debian sin ninguna GUI y quiero que me notifiquen en mi script de Python cuando aparece una nueva unidad flash ... Sé que D-BUS distribuye esa información, pero no quiero usar D-BUS. ¿Hay un acceso más simple a esa información? ¿No debería estar disponible en/proc o/sys? ¿Cómo puedo "conectarme" a esa fuente?¿Cómo puedo detectar cuando una unidad flash está conectada en Linux?

adiós falstaff

Respuesta

6

Usted puede leer uevents from kernel través de una toma Netlink y buscar eventos en los que "ACTION" es "add" (también se puede ver si una partición de un dispositivo se ha montado o desmontado, o si se va a quitar un dispositivo). Eso es lo más cercano a la fuente de eventos que uno puede obtener en el espacio de usuario. Hasta donde yo sé, así es como udev detecta medios extraíbles insertados.

Pero probablemente using D-Bus/HAL API via Python bingings sea mucho más fácil (no uevents análisis de datos, etc.). No estoy seguro de por qué te opones a esto. Como está utilizando Python, sospecho que los recursos no son realmente el problema.

+0

Gracias! Intento su enfoque o el de PeterMmm, aún no estoy seguro si voy a usar udev ... Bueno, uso python para programar un prototipo en mi máquina, que no tiene problemas de recursos, pero el destino es un dispositivo integrado, donde no lo hago desea instalar todas las cosas de D-Bus/HAL ... – falstaff

0

/proc/particiones muestra todas las particiones reconocidos por el núcleo.

+0

Sí, pero ¿cómo ayuda esto a detectar el evento de inserción? Especialmente porque no todas las distribuciones de Linux se montan automáticamente de forma predeterminada (aunque la mayoría lo hace). – sleske

+0

Incluso las particiones desmontadas se muestran en/proc/particiones: puede sondear el archivo. Sin embargo, la respuesta de Peter (udev) es probablemente mejor ya que udev está ahí a menos que falstaff esté usando un kernel de la serie 2.4 – Kimvais

+0

Eso es verdad, no pensé en eso. udev sigue siendo una mejor solución por lo general, pero si tiene que arreglárselas con las encuestas, eso debería funcionar. – sleske

9

Todas las principales distribuciones de Linux incluyen udev, que le permite escribir scripts personalizados en eventos de hardware.

1

Cuando un dispositivo USB está conectado syslog escribe mensajes relacionados con esto a/var/log/messages. El comando "dmesg" muestra este registro. Puede consultar cerca del final del registro para ver a qué canal estaba conectado el dispositivo, generalmente es/dev/sd (letter) (number) dependiendo de las particiones y la cantidad de discos en serie conectados al sistema.

+0

Pero para que esto funcione, tendría que sondear dmesg, lo cual es muy feo (el sondeo consume el rendimiento e interfiere con la administración de energía). – sleske

+0

Lo menciono adjuntando a/dev/sd ** ... Bueno, de todos modos, muchas encuestas continúan. El anterior menciona algunas encuestas también. – whatnick

+0

@whatnick: Sí, es por eso que downvoted al principio: - /. – sleske

4

Si está apuntando a un dispositivo incrustado, puede ejecutar mdev en lugar de udev. A continuación, puede escribir reglas de mdev que son bastante simples y desencadena una secuencia de comandos.

Por supuesto que no está monitoreando directamente desde su script, mdev lo está haciendo, pero puede ejecutar cualquier comando. Probablemente puedas hacer lo mismo con udev, pero siempre me pareció bastante complicado.

+2

+1 para recoger en el objetivo incrustado. – whatnick

0

lo hice usando zenity en un guión y udev con el artículo en RHEL6 con:

KERNEL == "sd [BD]", los conductores == "usb", ACCIÓN == "add", RUN + = "/ ruta/a/script"

Cuestiones relacionadas