ACPI イベントから GUI をトリガーする

ACPI イベントから GUI をトリガーする

電源ボタンの押下を処理する tkinter アプリを作成しましたが、起動すべきときに起動しません。ただし、echo hello>>~/junkacpi アクションとして使用すると、電源ボタンが押されるたびに junk に hello が追加されます。アクション コマンドの前に exec またはドットを追加しても (現在のシェルで実行するため)、効果はありませんでした。どうすれば動作させることができますか?

編集:

mikejonesey の助けを借りて、それを動作させることはできましたが、その後、もう 1 つ問題が発生しました。スクリプトは、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) を実行します。

関連情報