udev から実行するとスクリプトが失敗するのはなぜですか?

udev から実行するとスクリプトが失敗するのはなぜですか?

私は bash スクリプトを書いていて、アプリケーションが実行中かどうかをチェックしています。実行されていない場合は、別のプロセス (子プロセスではない) で起動する必要があります。実行中の場合は、ウィンドウが最大化される必要があります。なんとか作成しましたが、スクリプト プロセスが終了したためか、新しいプロセスは開始後すぐに終了します。& 経由でバックグラウンドで実行しないと、アプリは閉じませんが、スクリプトを 2 回目に実行してアプリを最大化することはできません。

#!/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

ターミナルで実行すると、正常に動作します。udevルールから呼び出すと、アプリが終了します。nohupを使用しても同じ結果になります。これがudevルールです。

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

答え1

ようやく回避策を見つけました。2つ目のスクリプトには、

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

このスクリプトは udev ルールから呼び出す必要があります。 動作させるには、 をインストールし、 を呼び出してat有効にする必要があります。 少しハッキーですが、少なくとも動作します。atdsudo systemctl enable atd --now

systemd アプローチを削除したので、この投稿はより簡単なガイドになります。

関連情報