Was ist die beste Möglichkeit, ein Skript, das eine langfristige Anwendung ausführen soll, mehrmals über ein Udev-Ereignis auszuführen?

Was ist die beste Möglichkeit, ein Skript, das eine langfristige Anwendung ausführen soll, mehrmals über ein Udev-Ereignis auszuführen?

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

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

verwandte Informationen