Hice un guión para rotar mi tableta Wacom Bamboo 180 grados. Funciona bien cuando lo ejecuto como yo mismo (usuario) o root, pero cuando se inicia desde udev(es decir, al conectar la tableta a un usbpuerto) no funcionará.
Reglas de Udev :
SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"
Script de Wacom /usr/local/bin/red-wacom-bamboo.sh :
#!/usr/bin/env bash
exec > /tmp/red-wacom.log
exec 2>&1
# I had to do this otherwise xsetwacom would say:
# "Failed to open Display ."
# Is there a way to do this without using my username?
export XAUTHORITY=/home/redsandro/.Xauthority
export DISPLAY=:0
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Pen stylus" Rotate half
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Finger touch" Rotate half
Resultado en /tmp/red-wacom.log :
Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.
(Tenga en cuenta que el error en el registro significa que la regla udev en sí no es el problema).
Traté de establecer un sleepen el script, tal vez necesite algunos ms. Pero eso no ayuda.
- ¿Por qué no funciona este script cuando se llama directamente desde
udev?- ¿Cómo puedo solucionar esto?
- ¿Puedo llamar a un script desde
udevun usuario específico? (p. ej., sincronización/homecon una unidad de respaldo externa - / home / solo es visible para su usuario)

55? Siempre uso la idea de que "las entradas innumerables se procesan en último lugar, por lo que es mejor omitir números para entradas personalizadas"./usr/share/X11/xorg.conf.d/50-wacom.conftiene 50 en mi sistema, así que elegí 55 para seguirlo . No estoy seguro de que incluso importe.Cuando conectas el dispositivo:
No puede ejecutarse
xsetwacomantes de la etapa 2. Su script está fallando porque lo está ejecutando en la etapa 1, cuando X aún no conoce el dispositivo.Puede establecer algunas configuraciones con
gnome-settings-daemon. Creo que recibe su notificación del nuevo dispositivo a través de D-Bus , pero no sé cómo es el evento D-Bus. Intenta espiar en el autobús condbus-monitor.fuente
sleepcon unos segundos. Cuando se conecta, la tableta funciona después de menos de un segundo, por lo que cuando se ejecutan los comandos, el dispositivo ya está detectado y en usoX. ¿Pero todavía no funciona?Funciona si crea dos archivos, udev llama a un script de contenedor, que a su vez llama al script de configuración real en segundo plano. La secuencia de comandos de configuración necesita dormir un poco, para que X11 tenga tiempo para hacer su trabajo. Aquí está la configuración que uso:
Script de envoltorio llamado por udev (/usr/local/bin/setupwacom.sh):
Script de configuración llamado por el script de reiniciador (/usr/local/bin/setupwacom-post-X11.sh):
fuente
Ninguna de las respuestas aquí funcionó para mí, y las opciones que quería establecer no podían especificarse en
xorg.conf:Terminé teniendo que iniciar el script con un servicio systemd activado por una regla udev:
El proveedor y la identificación del modelo se pueden encontrar ejecutándose
lsusbcon el dispositivo enchufado.Para recargar las reglas de udev:
Esto
TAG+="systemd"permite que otros servicios systemd (sistema o usuario) dependan del dispositivo (lo registra como una unidad de dispositivo, verman systemd.device). Para encontrar el nombre de la unidad del dispositivo, ejecuteudevadm monitory conecte la tableta. yo obtengoPara comprobar que systemd lo está recogiendo, haga
Por lo tanto, la unidad del dispositivo es
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device, y se puede usar en la unidad de servicio systemdHay una unidad de dispositivo por puerto usb.
Luego habilite y vuelva a cargar la unidad con
systemctl --user enable wacom.serviceysystemctl --user daemon-reload.El script aún necesita dormir un poco para que xsetwacom encuentre el dispositivo y configure
$DISPLAYy$XAUTHORITY.Type=oneshotfunciona bien al enchufarlo, pero no lo ejecuta si el dispositivo ya estaba enchufado al arrancar la computadora. Es por eso que necesitaba usar un servicio de usuario en lugar de uno de sistema, y por qué la unidad también lo ha hechoWantedBy=default.target. El problema con oneshot es que estaba bloqueando startx.Type=forkingyRestart=nole dice a systemd que no espere a que salga el proceso bifurcado del script, para que el script pueda dormir en segundo plano esperando que Xorg comience.fuente
\xque\\xen el archivo de servicio. My WantedBy se veía así al final:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.devicey ahora se activan ... antes que no.La solución alternativa de derobert no es adecuada para todas las situaciones (si no puede usar xorg.conf).
El ajuste y la
sleepsolución propuestos por Adrian de alguna manera no funcionan para mí (ubuntu 16.04).Si agrega esto a la parte superior de su script xsetwacom:
Puede ver en el resultado que el script xsetwacom todavía se ejecuta de alguna manera antes de que
xinputse dé cuenta del wacom. No importa cuánto tiempo duermas.Lo que propongo aquí es otra solución / solución usando el pequeño programa en el que es más simple que la solución de spelufo (que no probé) pero que solo requiere instalar el
atprograma. (sudo apt install atpara usuarios de debian).Ahora cambie su script de envoltura (la respuesta de Adrian) a algo como esto:
atnormalmente se usa para programar un comando una vez, por ejemplo, puede programar una hora por adelantadoat now +1 hours -f yourscript.sh. Pero como solo puede agregar minutos / horas / días / semanas, los utilicénowsin agregarlos, pero confío en el sueño dentro del script xsetwacom.fuente
at nowsin bifurcación. ¿Alguna razón para eso? En realidad, con elatmétodo ni siquiera necesita el script de envoltura. Puede agregarlo directamente como.., RUN+="/usr/bin/at now -f script-path":)at