Warum schlägt mein Skript fehl, wenn es von udev ausgeführt wird?

Warum schlägt mein Skript fehl, wenn es von udev ausgeführt wird?

Ich schreibe ein Bash-Skript und prüfe, ob die Anwendung läuft. Wenn sie nicht läuft, sollte sie in einem separaten Prozess (kein untergeordneter Prozess) gestartet werden. Wenn sie läuft, sollte das Fenster maximiert sein. Ich habe es irgendwie geschafft, aber der neue Prozess wird kurz nach dem Start beendet, wahrscheinlich weil der Skriptprozess endet. Wenn ich es nicht über & im Hintergrund laufen lasse, wird die App nicht geschlossen, aber dann kann ich das Skript kein zweites Mal ausführen, um die App zu maximieren.

#!/bin/bash
if pgrep app
then
    echo app is running
    # Maximize the app
    wmctrl -x -r WMClassOfapp -b "add,maximized_vert,maximized_horz"
else
    echo app is not running
    /usr/bin/app 
fi

Wenn ich es in einem Terminal ausführe, funktioniert es einwandfrei. Wenn ich es über die udev-Regel aufrufe, wird die App beendet. Die Verwendung von nohup führt zum gleichen Ergebnis. Hier ist die udev-Regel

ACTION=="add" \
, KERNEL=="hci0:3585" \
, SUBSYSTEM=="bluetooth" \
, ENV{DISPLAY}=":0" \
, ENV{HOME}="/home/user"
, RUN+="/home/user/runapp"

Antwort1

Ich habe hier endlich einen Workaround gefunden. Man braucht ein zweites Skript, das enthält

#!/bin/bash
echo /pathto/runApp | at now

Dieses Skript muss von der udev-Regel aufgerufen werden. Damit es funktioniert, atmuss es installiert sein und Sie müssen es atddurch einen Aufruf aktivieren sudo systemctl enable atd --now. Es ist ein bisschen umständlich, aber es funktioniert zumindest.

Ich habe den systemd-Ansatz gelöscht, damit der Beitrag eine einfachere Anleitung darstellt.

verwandte Informationen