Uso Linux Mint 13 MATE e intento configurar notificaciones cuando conecto/desconecto dispositivos.
En primer lugar, encontré el paquete udev-notify, pero desafortunadamente casi no funciona para mí:funciona por muy poco tiempo (1-2 minutos) y luego, si conecto/desconecto cualquier dispositivo, se cuelga:
Traceback (most recent call last):
File "./udev-notify.py", line 319, in <module>
notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files
No he encontrado ninguna solución, así que tuve que eliminarlo. (informe de error presentado también)
Sorprendentemente, no hay utilidades similares que haya encontrado hasta ahora. Luego traté de escribir reglas udev que deberían coincidir con todos los dispositivos. He agregado un nuevo archivo /etc/udev/rules.d/notify.rules
:
ACTION=="add", RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"
Y dos guiones:
enchufe_dispositivo.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device plugged"
/usr/bin/play -q /path/to/plug_sound.wav &
dispositivo_unplug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device unplugged"
/usr/bin/play -q /path/to/unplug_sound.wav &
Funciona, pero funciona muy tonto. Mis preguntas son:
- Cómo obtener el título real del dispositivo adjunto, el mismo que puedo ver en
lsusb
¿producción? Actualmente, acabo de recibir notificaciones como "conectado" y "desconectado", y no puedo encontrar cómo puedo recuperar el nombre del dispositivo en mi regla udev (si puedo, lo pasaría a mi script como un parámetro) - Actualmente, hay demasiadas notificaciones activadas. Digamos, cuando conecto mi memoria USB, ¡recibí alrededor de 15 notificaciones! Pero, si ejecuto
lsusb
, la memoria USB adjunta se muestra como un solo dispositivo. Entonces, parece que debería agregar más argumentos al filtro de reglas, pero no puedo encontrarlo. - ¿Probablemente haya alguna solución mejor para las notificaciones de conexión/desconexión de dispositivos? Sugiera si sabe algo.
Respuesta aceptada:
Bueno, después de muchas horas de buscar en Google y preguntar en los foros, lo hice funcionar (al parecer). Cualquier persona que quiera recibir una buena notificación visual y/o de audio cuando algún dispositivo USB esté conectado/desconectado puede instalar mi secuencia de comandos; consulte los detalles de instalación a continuación.
En primer lugar, respuestas a mis propias preguntas.
lsusb
salida?
No hay tales títulos en el núcleo (en el caso común). Hay un archivo de base de datos con títulos para muchos pares vendor_id:product_id
, normalmente es /usr/share/hwdata/usb.ids
expediente. Esta base de datos se puede actualizar mediante /usr/sbin/update-usbids.sh
. Gracias a los chicos de linux.org.ru por esa información.
No sé si hay alguna herramienta especial para obtener el título del dispositivo por par vendor_id:product_id
, así que tuve que hackear un poco con lsusb
y grep
:por ejemplo, lsusb | grep '0458:003a'
Debo admitir que no he descubierto cómo escribir una regla para esto, pero encontré otra forma de filtrarlo.
udev
nos permite usar algunas sustituciones para RUN+="..."
:por ejemplo, podemos obtener el número de bus y el número de dispositivo mediante $attr{busnum}
y $attr{devnum}
respectivamente. En primer lugar, en mi secuencia de comandos almaceno una lista de dispositivos adjuntos en el archivo especial, de modo que si la secuencia de comandos obtuvo un nuevo evento de "conexión", y el busnum y devnum de este dispositivo ya están almacenados en nuestro archivo, entonces no se genera la notificación. Y en segundo lugar, estas sustituciones $attr{busnum}
y $attr{devnum}
generalmente están disponibles solo para uno de los dispositivos de la "serie" de eventos. Pero de todos modos, el algoritmo explicado debería resolverlo en cualquier caso.
Página del proyecto actual:my-udev-notify.
Se ve así:
Detalles de instalación.
Probado en Linux Mint 13, creo que debería funcionar en Ubuntu y otros derivados de Ubuntu, y espero que funcione en cualquier sistema *nix con udev
.
- Vaya a la página del proyecto, obtenga las fuentes de allí y colóquelas en algún lugar. Solo hay una secuencia de comandos principal:
my-udev-notify.sh
, pero el archivo también contiene sonidos para notificaciones de conexión/desconexión, además de más información, consultereadme.txt
para más detalles. - Crear archivo
/etc/udev/rules.d/my-udev-notify.rules
con los siguientes contenidos:(no olvide modificar la ruta a su ruta real donde descomprimiómy-udev-notify.sh
!)
ACTION=="add", RUN+="/bin/bash /path/to/my-udev-notify.sh -a add -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
Después de esto, debería funcionar para dispositivos recién conectados. Es decir, si desconecta
algún dispositivo, no recibirá ninguna notificación. Pero cuando lo vuelvas a conectar, lo harás.
(sí, para mí funciona sin ningún reinicio de udev. Si no funciona para ti, intenta
reiniciar)
Para que funcione para todos los dispositivos, simplemente reinicie su sistema. TENGA EN CUENTA que puede haber
muchas notificaciones durante el primer arranque (consulte los problemas conocidos en el readme.txt
). En el segundo
arranque, no habrá notificaciones (a menos que conecte un nuevo dispositivo cuando
el sistema esté apagado)
Puede personalizarlo (activar/desactivar las notificaciones visuales y de sonido, o cambiar los sonidos), consulte readme.txt en el archivo para obtener más detalles.