
Aqui está uma regra do meu /lib/udev/rules.d
diretório:
SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"
Aqui está o conteúdo simples do udev-receiver.sh
script:
#!/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
Quando eu conecto meu dispositivo, a saída external.log
é a esperada:
UDEV-RECEIVER INIT
UDEV-RECEIVER FINISH
Done
No entanto, também estou acompanhando o syslog /var/log/syslog
e posso ver que, embora eu tenha bifurcado o sleep
processo de longa execução, udev
a inicialização do dispositivo está bloqueando até Done
aparecer no meu external.log
arquivo.
A razão pela qual isso é importante é porque estou tentando definir algumas propriedades do dispositivo, xinput
mas o dispositivo não é listado xinput list
até que toda a udev
inicialização seja concluída (até depois de Done
aparecer em external.log
).
De acordo comudev(7) - página de manual do Linux
"Adicione um programa à lista de programas a serem executados para um dispositivo específico. Isso só pode ser usado para tarefas de execução muito curtas. A execução de um processo de evento por um longo período de tempo pode bloquear todos os eventos adicionais para este ou um dispositivo dependente. Tarefas de longa duração precisam ser imediatamente separadas do próprio processo de evento."
Não consigo conciliar a página de manual e o comportamento que estou vendo. Alguém pode esclarecer ou oferecer uma maneira melhor de definir propriedades xinput
quando um dispositivo é inserido?
Obrigado!
Responder1
Respondendo à minha própria pergunta depois de muitas pesquisas adicionais.
A nova "filosofia" do udev
Aparentemente, a nova maneira "adequada" de usar udev
é não incorrer em processos de longa duração.
RUN ... Iniciar daemons ou outros processos de longa execução não é apropriado para o udev; os processos bifurcados, desanexados ou não, serão eliminados incondicionalmente após o término do tratamento do evento.
Observe como isso está em contradição com a citação da página de manual no OP.
Meu melhor palpite é que uma udev
mudança recente (~2012 em algum momento) força todos os processosIncluindoseus filhos bifurcados terminem antes de permitir que a execução continue como um mecanismo de aplicação desta nova filosofia.
Portanto, toda a documentação e respostas facilmente acessíveis na web que fornecem o padrão no OP como solução estão agora quebradas.
A nova filosofia de padrão de longa duração é compreensível quando você está falando sobre algum daemon que está sempre em execução quando o dispositivo está conectado. No entanto, isso elimina o defer
caso de uso efetivo junto com ele.
Gambiarra
No entanto, também descobri uma solução 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
ObservaçãoIsso foi testado e funciona no Ubuntu 13.04
ObservaçãoVocê precisará instalar at
um pacote de tarefas assíncronas viasudo apt-get install at
Eu juntei a solução alternativa dehttps://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in