
Tenho um dispositivo que se conecta via USB quando um botão é pressionado. A conexão cessa imediatamente quando o botão é liberado. Quero iniciar um aplicativo gráfico ao pressionar este botão.
Consegui acessar o botão com sucesso e iniciar o aplicativo. O problema é que quando pressiono o botão várias vezes, o aplicativo reinicia repetidamente após ser fechado, porque o udev aparentemente coloca os eventos na fila ou os retém até que possam ser processados.
Então escrevi um script bash que verifica se o aplicativo está em execução. Quando não está em execução, ele inicia o aplicativo. Quando está em execução, maximiza o aplicativo. Aqui ocorreu o mesmo problema, então tentei iniciar o aplicativo em segundo plano com &
, mas ele foi encerrado quando a regra do udev foi concluída. Mesmo comnohup
Talvez um script bash não seja o melhor caminho aqui. Preciso de um script que possa iniciar um aplicativo de longo prazo em um processo separado, para que o script possa terminar e ser executado novamente. Deveria, se possível, também ser um método nativo do Linux, para não precisar instalar mais dependências.
Eu encontrei esse tópicoComo executar um processo demorado em um evento Udev?que trata do mesmo problema. Ele aparentemente resolveu isso usando cmd | at now
, mas esse comando parece estar obsoleto, já que o cronie não tem esse comando como o cron tinha.
Acabei de descobrir que at é um pacote que você precisa instalar, mas o aplicativo também inicia várias vezes e o script não termina.
Estou executando o Manjaro, basicamente o Arch.
Responder1
Para resolver o problema das filas do udev, os eventos que uso RUN+="/local/run.sh /local/main-script.sh"
onde run.sh contém
#!/bin/bash
echo $1 | at now
Você precisa sudo apt-get install at
primeiro.
Para evitar múltiplas execuções, você precisa de algo como
if [ -f /opt/running_on ]; then
exit
else
echo run > /opt/running_on
# put your commands here
sleep 10
rm /opt/running_on
fi