透過 udev 事件多次運行旨在運行長期應用程式的腳本的最佳方法是什麼?

透過 udev 事件多次運行旨在運行長期應用程式的腳本的最佳方法是什麼?

我有一個按下按鈕時透過 USB 連接的裝置。當按鈕被釋放時,它會立即停止連線。我想在按下此按鈕時啟動圖形應用程式。

我可以成功訪問按鈕並啟動應用程式。問題是,當我多次按下按鈕時,應用程式在關閉後會一次又一次地重新啟動,因為 udev 顯然會將事件排隊或保留它們直到可以處理它們。

所以我編寫了一個 bash 腳本來檢查應用程式是否正在運行。當它不運行時,它會啟動應用程式。當它運行時,它會最大化應用程式。這裡發生了同樣的問題,所以我嘗試在後台啟動應用程序&,但當 udev 規則完成時它被殺死。與相同nohup

也許 bash 腳本不是最好的方法。我需要一個可以在單獨的進程中啟動長期應用程式的腳本,以便該腳本可以完成並再次運行。如果可能的話,它也應該是 Linux 本機方法,這樣我就不必安裝更多依賴項。

我找到了這個線程如何在 Udev 事件上運行長時間進程?處理同樣的問題。他似乎用 using 解決了這個問題cmd | at now,但這個命令似乎被棄用,因為 cronie 沒有像 cron 這樣的命令。

我剛剛發現 at 是一個需要安裝的包,但是應用程式也啟動了多次並且腳本沒有完成。

我正在運行 Manjaro,所以基本上是 Arch。

答案1

為了解決 udev 對事件進行排隊的問題,我使用RUN+="/local/run.sh /local/main-script.sh"run.sh 包含的事件

#!/bin/bash

echo $1 | at now

sudo apt-get install at首先需要。

為了避免多次運行,你需要類似的東西

if [ -f /opt/running_on ]; then
    exit
else
   echo run > /opt/running_on
   # put your commands here
   sleep 10
   rm /opt/running_on
fi

相關內容