$ qdbus com.canonical.Unity /com/canonical/Unity/Session | grep 'signal.*Requested.*'
signal void com.canonical.Unity.Session.LockRequested()
signal void com.canonical.Unity.Session.LogoutRequested(bool have_inhibitors)
signal void com.canonical.Unity.Session.RebootRequested(bool have_inhibitors)
signal void com.canonical.Unity.Session.ShutdownRequested(bool have_inhibitors)
signal void com.canonical.Unity.Session.UnlockRequested()
#!/bin/bash
main()
{
ARG="cow"
dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal" |
while read -r line;
do
grep -q '.*NameAcquired.*' <<< "$line" && continue # Ignore that first line
if [ -n "$line" ];then
interrupt $ARG # call your python snapshot script here
fi
done
}
interrupt()
{
echo 'Old McDonald had a ' $ARG ' e-i-e-i-o '
}
main
基础理论
您可能知道也可能不知道,很多 Unity 操作都是使用dbus实现的。dbus 的最大便利在于,您可以通过在命令行中调用适当的方法来执行大量需要 root 的操作,而无需拥有管理员帐户,例如关闭系统。
特别是在我们的案例中,我们对
com.canonical.Unity
服务、/com/canonical/Unity/Session
路径感兴趣。qdbus
您可以使用命令列出有关它的信息。特别是我们对其中包含的信号感兴趣Requested
。当用户单击 Unity 顶部栏右侧的下拉会话菜单中的任何关闭、锁定、注销或重新启动项目时,这些信号就会出现在总线上。所以我们需要做的是:
当然,最大的声明是,如果用户使用
sudo shutdown -P now
orgnome-session-quit
,则不会告知dbus
,因此任何想要的操作都不会执行。监控 dbus
方便地有一个命令,
dbus-monitor
我们可以使用一组选项过滤其输出,并使用while read do … done
结构对其执行操作Bellow 是一个简单的监控脚本示例。
它所做的只是监视总线上的信号,并在它们出现时将它们回显到标准输出;当然 echo 可以是任何命令。运行它,然后尝试单击会话菜单中应该生成信号的每个项目,您应该会看到如下内容:
所以现在我们有了一个监控功能,一旦发生中断就可以执行一个动作。现在,为了解决您试图解决的特定问题,您的脚本正在对桌面上的图标进行快照。如果我们每次出现信号时都拍摄快照,这并没有什么坏处——它不必专门重新启动或关闭。因此,如果我们监控特定 Unity 接口的信号并在每个信号到达时拍摄快照,我们就可以简化脚本。
中断驱动脚本
在下面,您可以看到一个中断驱动的脚本,它将监视总线的信号(忽略第一个),如果我们有信号进入,则调用一个中断函数(在您的情况下,它将是您的图标快照脚本)我写过)。
注意:Dbus 依赖于 GUI 会话,因为(据我所知)它以 Unity/Gnome 登录开始。较旧的环境(例如 blackbox 和 openbox)以及 TTY 环境不会启动 dbus 会话,因此如果您尝试在其中启动它,该脚本将会呕吐
~/.profile
(我有一个用户试图做类似的事情,但他遇到了麻烦)。使用 Unity 或 Gnome 的启动应用程序启动此类脚本。超越这个脚本
qdbus
,因为它很简单,但总是可以使用dbus-send
. 例子dbus
方法。有很多东西要研究。琐事:如果 apt 正在运行,我使用相同的方法来防止关机