從 acpi 事件觸發 gui

從 acpi 事件觸發 gui

我製作了一個 tkinter 應用程式來處理電源按鈕按下的情況,但它沒有在應該啟動的時候啟動。儘管如果我用作echo hello>>~/junkacpi 操作,它會為每次按下電源按鈕時添加一個“hello to junk”。在操作命令之前新增 exec 或點(以在目前 shell 中執行它)沒有幫助。我怎樣才能讓它發揮作用?

編輯:

好吧,我在 MikeJonesey 的幫助下解決了這個問題,但之後又出現了一個問題。即使在腳本上設定了 suid 位,該腳本也會以 root 權限調用,因此我必須在 xlock 螢幕上輸入 root 密碼才能恢復。

編輯2:

看起來我可以從 acpi 事件文件啟動應用程序,如下所示: event=button/power PBTN action=export DISPLAY=:0 && export XAUTHORITY=/home/saga/.Xauthority &&/home/saga/bin/shutdownprompt

但不是來自事件文件呼叫的處理程序腳本:

button/power ) if [ "$2" = "PBTN" ];then export DISPLAY=:0 && export XAUTHORITY=/home/saga/.Xauthority && /home/saga/shutdownprompt; fi ;;

這是每次按鍵時調用的主處理程序腳本的剪輯。這裡有什麼問題?

答案1

你需要添加一些東西才能使用X;

我在 cronjob 中使用它們(這是同一件事...)

#*/15 * * * *   export DISPLAY=:0.0 && export XAUTHORITY=/home/mike/.Xauthority && /home/mike/bin/defunct-check.sh

這應該適用於任何腳本。

答案2

看來這個問題應該有一個簡單的解決方案。我自己也嘗試做類似的事情:按下鍵盤按鈕時運行螢幕擷取程式(flameshot)。

最後,對我有用的解決方案是在我的主目錄中建立一個名為 的 FIFO(命名管道).acpi_execute.pipe。然後我使用以下腳本,稱為.acpi_execute.

#!/usr/bin/bash

while true ; do
    while IFS='' read command ; do
        $command
    done < ~/.acpi_execute.pipe
done

與 GNOME、KDE ​​等相比,我更喜歡 i3,因為它的性能(非常輕量級)和平鋪特性。在我的 i3 設定檔的底部~/.config/i3/config有:

exec ~/.acpi_execute

這允許腳本在我的桌面環境啟動時運行(無論是直接在電腦上還是透過遠端 VNC 連接)。

請注意,上述內容具有安全隱患。例如,如果任何人都可以寫入上述管道,他們就可以執行任意命令作為你。這顯然會很糟糕。授予您自己擁有的 FIFO 600 權限可以降低這種風險。您也可以限制可能的命令。也就是說,不要執行$command,而是執行您想要的特定命令(例如,flameshot gui)。

相關內容