Eu tenho esta regra UDEV, que é ativada quando eu conecto meu teclado:
ACTION=="add", DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/0003:046A:0011.00??/input/input??/event[0-9][0-9]*", ATTRS{name}=="HID 046a:0011", ATTRS{phys}=="usb-0000:00:14.0-1/input0", RUN+="/home/*user*/.udev_rule_scripts/cherry_keyboard.sh", SYMLINK+="cherrysymlink"
Deveria
- crie um link simbólico
/dev/cherrysymlink
, o que ele faz e
- executa um script de shell, o que não acontece.
Aqui está a saída de depuração de udevadm test /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/0003:046A:0011.0003/input/input18/event17
:
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.
.INPUT_CLASS=kbd
ACTION=add
DEVLINKS=/dev/input/by-id/usb-046a_0011-event-kbd /dev/cherrysymlink /dev/input/by-path/pci-0000:00:14.0-usb-0:1:1.0-event-kbd
DEVNAME=/dev/input/event17
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/0003:046A:0011.0003/input/input18/event17
ID_BUS=usb
ID_INPUT=1
ID_INPUT_KEY=1
ID_INPUT_KEYBOARD=1
ID_MODEL=0011
ID_MODEL_ENC=0011
ID_MODEL_ID=0011
ID_PATH=pci-0000:00:14.0-usb-0:1:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_1_0
ID_REVISION=0100
ID_SERIAL=046a_0011
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030101:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=046a
ID_VENDOR_ENC=046a
ID_VENDOR_ID=046a
LIBINPUT_DEVICE_GROUP=3/46a/11/111:usb-0000:00:14.0-1
MAJOR=13
MINOR=81
SUBSYSTEM=input
USEC_INITIALIZED=31155231
run: '/usr/local/bin/cherry.sh'
Quando o teclado está conectado, /dev/cherrysymlink
é criado. Além disso, a saída de depuração diz na última linha que o script /usr/local/bin/cherry.sh
foi realmente executado.
O problema é que o script não é realmente executado.
cherry_keyboard.sh
:
#!/bin/bash
xset r rate 150 60
Ele deve alterar a repetição automática das teclas do teclado, mas permanece o mesmo.
Eu também tentei:
#!/bin/bash
slock
Nada acontece. Quando executo os scripts manualmente no shell, ambos funcionam. O que estou fazendo errado?
EDITAR:
Depois de modificar meu script assim, posso enviar a echo
em dzen2
para que ela apareça na tela:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/*user*/.Xauthority
echo 'test' > /home/*user*/.udev_rule_scripts/test
echo 'test' | dzen2 -p 4
xset r rate 150 60
slock
Até agora, os dois primeiros echo
-lines funcionam. Os comandos xset
e slock
ainda não funcionam.
EDIT2:
Após algumas leituras, tenho certeza que tem algo a ver com o DBUS e a variável de ambiente "DBUS_SESSION_BUS_ADDRESS". Além disso, quando executo o printenv como usuário, há DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
set. Quando executo o printenv como root esta variável não está definida.
Por isso, fiz outra modificação no meu script:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/*user*/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
echo 'test' > /home/*user*/.udev_rule_scripts/test
echo 'test' | dzen2 -p 4
xset r rate 150 60
slock
Infelizmente, ainda não funciona.
EDIT3:
Após a sugestão de Gilles, adicionei uma linha ao script:
#!/bin/bash
exec >>/home/*user*/.udev_rule_scripts/test.log 2>&1; echo; date
export DISPLAY=:0
export XAUTHORITY=/home/*user*/.Xauthority
echo 'test' | dzen2 -p 4
xset r rate 150 60
slock
, que produz a seguinte mensagem de erro em test.log
Tue Feb 23 10:14:17 UTC 2016
/home/*user*/.udev_rule_scripts/cherry_keyboard: line 11: 858 Segmentation fault (core dumped) slock
qual (tipo de) explica por que slock
falha em executar.
Infelizmente, não há nada sobre xset
.
EDIT4:
Desta vez, combinei as sugestões de Gilles e ojs. Agora as mensagens de erro são mais interessantes:
cherry_keyboard.sh
:
#!/bin/bash
exec >>/home/*user*/.udev_rule_scripts/test.log 2>&1; echo; date
export DISPLAY=:0
export XAUTHORITY=/home/*user*/.Xauthority
echo 'test' | dzen2 -p 4
su *user* -c "DISPLAY=:0 xset r rate 150 60"
su *user* -c "DISPLAY=:0 slock"
test.log:
Tue Feb 23 10:37:22 UTC 2016
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 43 requests (37 known processed) with 0 events remaining.
Tue Feb 23 10:38:37 UTC 2016
dzen: cannot open display
xset: unable to open display ":0"
slock: cannot open display
Tue Feb 23 10:40:54 UTC 2016
Agora aqui está a coisa: Quando eu insiro o meu teclado, dzen2
aparece na tela, então a tela fica preta. Mas não por causa do slock
, ele cai e quando eu digito no teclado a tela fica preta (o que não deveria acontecer quando o slock estava por trás). Outros aplicativos como moc
ainda estão em execução.
E agora a parte estranha:
Quando eu pressiono o botão liga / desliga no meu laptop para reiniciar o sistema (que é a única opção nessa situação), antes do desligamento, a tela preta desaparece por meio segundo e aparece uma tela vermelha (a tela vermelha de slock quando você digita uma senha errada). Então, o slock está realmente rodando. Mas por que a mensagem de erro afirma que dzen
e slock
"não podem abrir a exibição", enquanto na verdade estão sendo executados? E por que a tela falha? E de que maneira a mensagem de erro xset
é diferente?
Uma alternativa cherry_keyboard.sh
:
#!/bin/bash
exec >>/home/*user*/.udev_rule_scripts/test.log 2>&1; echo; date
export DISPLAY=:0
export XAUTHORITY=/home/*user*/.Xauthority
echo 'test' | dzen2 -p 4
su *user* -c "DISPLAY=:0 xset r rate 150 60"
#su *user* -c "DISPLAY=:0 slock"
test.log
:
Tue Feb 23 10:43:36 UTC 2016
Portanto, desta vez não há mensagens de erro.
Mas, em ambas as versões, xset
não modifica a repetição automática ...