
Ich habe ein Gerät, das sich per USB verbindet, wenn ich eine Taste drücke. Die Verbindung wird sofort wieder getrennt, wenn ich die Taste loslasse. Ich möchte eine grafische Anwendung starten, wenn ich diese Taste drücke.
Ich konnte den Button erfolgreich aufrufen und die Anwendung starten. Das Problem ist, dass bei mehrmaligem Drücken des Buttons die Anwendung nach dem Schließen immer wieder neu startet, weil udev die Ereignisse anscheinend in eine Warteschlange stellt bzw. festhält, bis sie verarbeitet werden können.
Also habe ich ein Bash-Skript geschrieben, das prüft, ob die Anwendung läuft. Wenn sie nicht läuft, startet es die Anwendung. Wenn sie läuft, maximiert es die Anwendung. Hier trat das gleiche Problem auf, also habe ich versucht, die Anwendung im Hintergrund mit zu starten &
, aber dann wird sie beendet, wenn die udev-Regel beendet ist. Dasselbe mitnohup
Vielleicht ist ein Bash-Skript hier nicht der beste Weg. Ich brauche ein Skript, das eine Langzeitanwendung in einem separaten Prozess starten kann, sodass das Skript beendet und erneut ausgeführt werden kann. Es sollte, wenn möglich, auch eine native Linux-Methode sein, damit ich nicht noch mehr Abhängigkeiten installieren muss.
Ich habe diesen Thread gefundenWie führe ich einen langwierigen Prozess bei einem Udev-Ereignis aus?das sich mit demselben Problem befasst. Er hat es anscheinend mit gelöst cmd | at now
, aber dieser Befehl scheint veraltet zu sein, da Cronie diesen Befehl nicht wie Cron hat.
Ich habe gerade herausgefunden, dass es sich dabei um ein Paket handelt, das Sie installieren müssen. Anschließend startet die Anwendung jedoch auch mehrmals und das Skript wird nicht beendet.
Ich verwende Manjaro, also im Wesentlichen Arch.
Antwort1
Um das Problem der Udev-Warteschlangen zu lösen, verwende ich die Ereignisse, RUN+="/local/run.sh /local/main-script.sh"
bei denen run.sh enthält
#!/bin/bash
echo $1 | at now
Du brauchst sudo apt-get install at
zuerst.
Um Mehrfachdurchläufe zu vermeiden, benötigen Sie so etwas wie
if [ -f /opt/running_on ]; then
exit
else
echo run > /opt/running_on
# put your commands here
sleep 10
rm /opt/running_on
fi