¿Cómo ejecutar scripts personalizados en el complemento del dispositivo USB?


41

¿Cuál es el método de vanguardia para ejecutar automáticamente scripts personalizados en el complemento del dispositivo USB en las distribuciones actuales de Linux como Debian / CentOS / Fedora?

Por ejemplo, si desea montar / copiar automáticamente algunos archivos / desmontar un dispositivo de almacenamiento masivo USB basado en su UUID (o ID de dispositivo, etc.).

Respuestas:


27

Pon una línea como esta en un archivo en /etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

Agregue una cláusula como NAME="subdir/mydisk%n"si desea utilizar una ruta de entrada personalizada en /dev.

Ejecute udevadm info -a -n sdbpara ver con qué atributos puede hacer coincidir ( attribute=="value"; reemplácelo sdbpor el nombre del dispositivo asignado automáticamente al disco, correspondiente a la nueva entrada creada /devcuando lo conecta). Tenga en cuenta que puede utilizar ATTRSlas cláusulas de cualquier uno estrofa: usted puede escoger cualquier estrofa, pero las ATTRScláusulas todo debe venir de la misma estrofa, no se pueden mezclar y combinar. Puede mezclar ATTRScláusulas con otros tipos de cláusulas enumeradas en una estrofa diferente.


1
¿Esta respuesta sigue siendo válida? Bajo ninguna cantidad de jugueteo puedo ejecutar el script (y tocar un archivo). Si puede proporcionar el ejemplo más básico que ejecuta una secuencia de comandos cuando algo está enchufado, sería genial y podemos trabajar desde allí.
Redsandro

@Redsandro Tengo variaciones de esta regla en mi configuración de udev y están funcionando. ¿Conectó y volvió a conectar el dispositivo o lo ejecutó udevadm trigger? ¿Su sistema utiliza udev? Si desea ejecutar un script cuando hay algo conectado, elimine todas las condiciones (las cláusulas con ==) (tal vez la sintaxis requiere una condición, no estoy seguro; si es así, use KERNEL=="*").
Gilles 'SO- deja de ser malvado'

Lo intenté también, pero como funciona para ti, debo perder un paso. He movido esta pregunta aquí , para poder escribir código de ejemplo.
Redsandro

Quizás relacionado, creo que hay un límite de tiempo en cuanto a la duración del script. Creo que es muy corto (como 1 segundo o algo así). Si lleva más tiempo que eso, udev lo matará. Puede solucionar este problema utilizando el script en segundo plano con algo como at. Consulte "ejecución de programas externos" en reactivated.net/writing_udev_rules.html
cheshirekow

Solo para agregar a esto, en aras de la integridad, el archivo debe tener el sufijo .rulesy los archivos en el directorio se leen en orden léxico (la convención usa un prefijo numérico para ordenarlos), y pueden estar debajo /etc/, /usr/libo /run. Para más, RTFM .
starfry

14

Busqué /lib/udev/rules.dejemplos de reglas relacionadas con el disco. En un sistema Ubuntu, un archivo de reglas proporciona la variable de entorno ID_FS_UUID_ENCque puede usar en sus propios archivos de reglas.

Por lo tanto, puse un archivo de reglas personalizado debajo /etc/udev/rules.d/foodevice.rules. Como no tiene el prefijo de un número, udev lo ejecuta finalmente. Por cierto, el demonio de udev estuvo atento /etc/udev/rules.da los cambios, por lo que no es necesario reiniciarlo en los cambios de archivos.

El contenido de /etc/udev/rules.d/foodevice.ruleses:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(esta es una regla: debe eliminar la nueva línea después de la cláusula ENV porque udev no tiene un mecanismo de continuación de línea)

Un programa iniciado por udev bloquea el demonio, por lo que no debería ejecutarse durante mucho tiempo. Lo resolví a través de at, es decir, separándome del proceso haciendo el trabajo real:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
Es posible que deba volver a cargar las reglas de udev utilizando udevadm control --reload-rules, según su distribución.
user44038

1
En lugar de at nowsugerir batch.
Restablecer a Monica - M. Schröder

¿Qué hacer cuando no tienes atni batch? Estoy en un entorno incrustado con busybox .
natenho

@natenho, puede usarlo ~/path/mountcopystuff.sh &, atetc. tiene la ventaja de que recibe notificaciones por correo electrónico en caso de que algo salga mal, pero en un sistema integrado esto probablemente no sea de mucho interés.
maxschlepzig
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.