Estoy tratando de configurar un script para que se ejecute cada vez que conecto un dispositivo USB. Creé el archivo /etc/udev/rules.d/90-local.rules y agregué la siguiente regla:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
El problema es que cuando la unidad está conectada, no sucede nada. La secuencia de comandos, con fines de depuración, está diseñada para enviar una notificación con notificación-envío, que está instalada y funciona bien desde el terminal.
La ruta al script es correcta, ya que ejecuté ese comando exacto en la terminal sin ningún problema.
Respuestas:
Yo tuve el mismo problema. Esto funcionó para mí:
Intente copiar su script
/usr/local/bin
y cambiar el directorio en su.rules
archivo.Además, no sé qué es SYSFS, pero preferiría usar las propiedades ATTR.
La siguiente línea es el contenido de mi
.rules
archivo:fuente
ATTRS{vendor}=="SanDisk "
parte quiere decir eso que sóloSandisk
se detecta?notify-send
requiere acceso a su bus de sesión DBus, que no puede tener por dos razones:No hay información sobre la sesión. Cuando lo inicia udev, su script no sabe nada sobre dónde está conectado o si está conectado en absoluto. El asiento múltiple con X11 sigue siendo complicado, pero el cambio de usuario funciona tanto para X11 como para sesiones de consola. Muchas personas también usan SSH, VNC y NX a través de la red.
(
DISPLAY=:0
funcionaría la mitad del tiempo, pero eso sigue siendo adivinar en el mejor de los casos)Negado por la política DBus. Incluso si su script de alguna manera encuentra su sesión X11, no podrá enviar notificaciones debido a que el script se está ejecutando en
root
lugar de su cuenta de usuario.fuente
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;
hizo el truco para mí con notificar-enviarEn su lugar, puede intentar hacer coincidir el dispositivo por ID de proveedor y producto. La siguiente regla personalizada funciona para mí:
Puede ver idVendor e idProduct en la salida lsusb o dmesg después de conectar el dispositivo.
fuente
Seguimiento de la respuesta de Aleh: si también desea monitorear
remove
eventos, debe buscar una variable de entorno llamadaID_SERIAL
. Contiene el proveedor y la identificación del producto separados por un guión bajo:La regla ahora es más corta también.
fuente
Tal vez, ¿deba agregar un
sleep
dentro del script, para darle al dispositivo usb la oportunidad de "establecerse"? Por ejemplo, módems usb 3g, cambio de modo para obtener un / dev / ttyUSB para que el núcleo lo ponga en funcionamiento.fuente
Intente reemplazar SUBSYSTEM = "usb" con SUBSYSTEMS = "usb"
fuente
SUBSYSTEM=="usb"
está bien