
Tengo un dispositivo que se conecta vía USB cuando se presiona un botón. La conexión se detiene inmediatamente cuando se suelta el botón. Quiero iniciar una aplicación gráfica cuando presiono este botón.
Pude acceder exitosamente al botón e iniciar la aplicación. El problema es que cuando presiono el botón varias veces, la aplicación se reinicia una y otra vez después de cerrarse, porque aparentemente udev pone en cola los eventos o los retiene hasta que puedan procesarse.
Entonces escribí un script bash que verifica si la aplicación se está ejecutando. Cuando no se está ejecutando, inicia la aplicación. Cuando se está ejecutando maximiza la aplicación. Aquí ocurrió el mismo problema, así que intenté iniciar la aplicación en segundo plano con &
, pero luego se cierra cuando finaliza la regla udev. Lo mismo connohup
Quizás un script bash no sea la mejor manera aquí. Necesito un script que pueda iniciar una aplicación a largo plazo en un proceso separado, para que el script pueda finalizar y ejecutarse nuevamente. Si es posible, también debería ser un método nativo de Linux, para no tener que instalar más dependencias.
encontré este hilo¿Cómo ejecutar un proceso prolongado en un evento de Udev?que se ocupa del mismo problema. Aparentemente lo resolvió usando cmd | at now
, pero estos comandos parecen estar en desuso, ya que cronie no tiene este comando como lo tenía cron.
Acabo de descubrir que at es un paquete que necesitas instalar, pero luego la aplicación también se inicia varias veces y el script no finaliza.
Estoy ejecutando Manjaro, así que básicamente Arch.
Respuesta1
Para solucionar el problema de las colas udev los eventos que uso RUN+="/local/run.sh /local/main-script.sh"
donde contiene run.sh
#!/bin/bash
echo $1 | at now
Necesitas sudo apt-get install at
primero.
Para evitar ejecuciones múltiples necesitas 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