Qual é a melhor maneira de executar um script, destinado a executar um aplicativo de longo prazo, várias vezes por meio de um evento do udev?

Qual é a melhor maneira de executar um script, destinado a executar um aplicativo de longo prazo, várias vezes por meio de um evento do udev?

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 atprimeiro.

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

informação relacionada