我制作了一个 tkinter 应用程序来处理电源按钮按下的情况,但它没有在应该启动的时候启动。尽管如果我用作echo hello>>~/junk
acpi 操作,它会为每次按下电源按钮时添加一个“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
)。