Quiero ejecutar un script cuando conecto un dispositivo en mi máquina Linux. Por ejemplo, ejecute con xinput
el mouse o un script de respaldo en una determinada unidad.
He visto muchos artículos sobre esto, más recientemente aquí y aquí . Pero simplemente no puedo hacer que funcione.
Aquí hay algunos ejemplos simples que intentan obtener al menos algún tipo de respuesta.
/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
La carpeta de reglas es vigilada por inotify
y debe estar activa de inmediato. Sigo desconectando mi teclado, mouse, tableta, tarjeta de memoria y unidad USB, pero nada. Ningún archivo de registro tocado.
Ahora, ¿cuál sería la forma más simple de al menos saber que algo está funcionando? Es más fácil trabajar desde algo que funciona que desde algo que no funciona.
udevadm trigger
o conectó un dispositivo para aplicar la nueva regla?3.5.0-23-generic
.Respuestas:
Si desea ejecutar el script en un dispositivo específico, puede usar los identificadores del proveedor y del producto
En
/etc/udev/rules.d/test.rules
:en
test.sh
:Con
env
, puede ver qué entorno se configura desde udev y confile
, descubrirá el tipo de archivo.Los atributos concretos para su dispositivo se pueden descubrir con
lsusb
da
fuente
ACTION=="add",
directamente a la definición de la regla.No se trata directamente de su pregunta, sino de lo que está haciendo. Si inicia un script de copia de seguridad desde udev, se enfrentará a dos problemas principales:
Mi consejo es crear un script en la página de inicio del usuario que escuche una canalización con nombre y que se iniciará de forma asincrónica como:
Nota: uso el montaje automático con kde, así que verifico si aparece la carpeta. Puede pasar el parámetro / dev / sd * en el fifo desde la regla udev y montarlo usted mismo en el script. Para escribir en el fifo no olvides que udev no es un shell y que la redirección no funciona. Tu RUN debería ser como:
RUN + = "/ bin / sh -c '/ bin / echo conectado >> / tmp / IomegaUsbPipe'"
fuente
He publicado una solución en /ubuntu//a/516336 y también estoy copiando la solución aquí.
Escribí un script de Python usando pyudev que dejo ejecutándose en segundo plano. Ese script escucha los eventos de udev (por lo tanto, es muy eficiente) y ejecuta el código que quiera. En mi caso, ejecuta
xinput
comandos para configurar mis dispositivos ( enlace a la versión más reciente ).Aquí hay una versión corta del mismo script:
fuente
call()
. De esa manera, si es necesario proporcionar argumentos alfoobar.sh
script, puede hacerlo dinámicamente.Para ejecutar el script en el arranque cuando se inserta el dispositivo usb, uso la solución a continuación:
Formatee el pendrive o cualquier otro almacenamiento usb y asígnele un nombre al hacerlo. Luego en
/etc/rc.local
agregar líneals -q /dev/disk/by-label > /home/pi/label.txt
creará un archivo txt llamado label.txt (puede ser cualquier otro nombre)
luego nuevamente en /etc/rc.local agregue otras 2 líneas:
Ahora, cada vez que se inserta un pendrive con el nombre USB_drive_name, se ejecutará el script.
Con algunas pequeñas modificaciones, la solución anterior se puede utilizar cuando el sistema está en funcionamiento.
fuente
udev
para otros momentos no son "algunas pequeñas modificaciones") y la Raspberry Pi. Hay un problema innecesariosudo
: serc.local
ejecuta como root, es un problema de escalada de privilegios: un archivo que un usuario normal puede editar se ejecuta como root.