為什麼我的腳本從 udev 運行時失敗?

為什麼我的腳本從 udev 運行時失敗?

我正在編寫 bash 腳本並檢查應用程式是否正在運行。如果它沒有運行,則應在單獨的進程(而不是子進程)中啟動。如果它正在運行,視窗應該最大化。我有點做到了,但新進程在啟動後不久就終止了,可能是因為腳本進程結束了。當我不通過 & 在後台運行它時,應用程式不會關閉,但我無法再次運行腳本以最大化應用程式。

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

我終於在這裡找到了解決方法。您需要第二個腳本,其中包含

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

必須從 udev 規則呼叫此腳本。為了使其工作,at必須安裝它,並且您必須atd透過呼叫 來啟用它sudo systemctl enable atd --now。這有點hacky,但至少它有效。

我刪除了 systemd 方法,因此這篇文章將是一個更簡單的指南。

相關內容