
Aquí hay una regla de mi /lib/udev/rules.d
directorio:
SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"
Aquí está el contenido simple del udev-receiver.sh
guión:
#!/bin/bash
echo "UDEV-RECEIVER INIT" >> /var/log/external.log
{
sleep 5;
echo "Done" >> /var/log/external.log
} &
echo "UDEV-RECEIVER FINISH" >> /var/log/external.log
Cuando conecto mi dispositivo, el resultado external.log
es el que se esperaría:
UDEV-RECEIVER INIT
UDEV-RECEIVER FINISH
Done
Sin embargo, también estoy siguiendo el syslog /var/log/syslog
y puedo ver que, aunque he bifurcado el sleep
proceso de larga duración, udev
la inicialización del dispositivo se bloquea hasta que Done
aparece después en mi external.log
archivo.
La razón por la que esto es importante es porque estoy intentando configurar algunas propiedades del dispositivo a través, xinput
pero el dispositivo no aparece en la lista hasta que se completa xinput list
la inicialización completa (hasta que aparece después en ).udev
Done
external.log
De acuerdo con laudev(7) - página de manual de Linux
"Agregue un programa a la lista de programas que se ejecutarán para un dispositivo específico. Esto solo se puede usar para tareas de ejecución muy cortas. La ejecución de un proceso de evento durante un período de tiempo prolongado puede bloquear todos los eventos adicionales para este o un dispositivo dependiente. Las tareas de larga duración deben separarse inmediatamente del proceso del evento en sí".
No puedo conciliar la página de manual y el comportamiento que estoy viendo. ¿Alguien puede arrojar luz u ofrecer una mejor manera de configurar propiedades xinput
cuando se inserta un dispositivo?
¡Gracias!
Respuesta1
Respondiendo a mi propia pregunta después de mucha investigación adicional.
La nueva "filosofía" de udev
Al parecer, la nueva forma "adecuada" de utilizarlo udev
es no incurrir en procesos de larga duración.
EJECUTAR... Iniciar demonios u otros procesos de ejecución prolongada no es apropiado para udev; los procesos bifurcados, separados o no, se eliminarán incondicionalmente una vez finalizado el manejo del evento.
Tenga en cuenta cómo esto contradice la cita de la página de manual en OP.
Mi mejor suposición es que un udev
cambio reciente (~2012 en algún momento) obliga a todos los procesosincluidosus hijos bifurcados terminen antes de permitir que la ejecución continúe como mecanismo de aplicación de esta nueva filosofía.
Por lo tanto, toda la documentación y las respuestas de fácil acceso en la web que brindan el patrón en OP como solución ahora no funcionan.
La nueva filosofía de patrón de larga duración es comprensible en el caso en que se habla de algún demonio que siempre se está ejecutando cuando el dispositivo está enchufado. Sin embargo, borra el defer
caso de uso efectivo junto con él.
Solución alterna
No obstante, también descubrí una solución alternativa:
/lib/udev/rules.d/98-mouse-config.rules/
SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", ACTION=="add|remove", ENV{ID_TYPE}!="hid", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"
udev-receiver.sh
#!/bin/bash
echo /home/mikeknoop/scripts/mouse.sh | at now
mouse.sh
#!/bin/bash
sleep 3;
export DISPLAY=":0.0"
export XAUTHORITY="/home/mikeknoop/.Xauthority"
/usr/bin/xinput --set-prop 'pointer:Microsoft Microsoft Wireless Optical Mouse® 1.0A' 'Device Accel Constant Deceleration' 2.00000
... more xinput rules here
NotaEsto fue probado y funciona en Ubuntu 13.04.
NotaDeberá instalar at
cuál es un paquete de tareas asíncrono a través desudo apt-get install at
Reuní la solución alternativa dehttps://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in