从 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)。

相关内容