Python - 在Linux上通过cron作业发送KDE knotify消息?
我想从一个定时任务(cron job)发送通知到KDE的knotify。下面的代码运行得很好,但当我把它作为定时任务运行时,通知却没有出现。
#!/usr/bin/python2
import dbus
import gobject
album = "album"
artist = "artist"
title = "title"
knotify = dbus.SessionBus().get_object("org.kde.knotify", "/Notify")
knotify.event("warning", "kde", [], title, u"by %s from %s" % (artist, album), [], [], 0, 0, dbus_interface="org.kde.KNotify")
有没有人知道我该如何把这个作为定时任务运行呢?
1 个回答
2
你需要提供一个叫做 DBUS_SESSION_BUS_ADDRESS
的环境变量。
你可以从正在运行的KDE会话中获取这个值。
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-iHb7INjMEc,guid=d46013545434477a1b7a6b27512d573c
在你的KDE启动设置中(配置里的自动启动模块),创建一个脚本,让它在环境启动后运行。把这个环境变量的值输出到你家目录下的一个临时文件中,然后你就可以在你的定时任务或Python脚本中从这个临时文件中设置这个环境变量。
#!/bin/bash
echo $DBUS_SESSION_BUS_ADDRESS > $HOME/tmp/kde_dbus.session
到2019年的KDE5版本,这个方法依然有效,但结果会稍有不同:
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:path=/run/user/1863/bus
要测试这个,你可以这样做:
$ qdbus org.freedesktop.ScreenSaver /ScreenSaver SimulateUserActivity
如果你还安装了旧版的KDE4二进制文件,可能需要使用 qdbus-qt5
。你可以通过以下方式确定该用哪个:
export QDBUS_CMD=$(which qdbus-qt5 2> /dev/null || which qdbus || exit 1)
当我想防止屏幕保护程序启动时,我会加一个睡眠命令来运行这个,它是有效的。我是从另一台电脑远程运行这个命令的。
对于那些想知道我如何锁定和解锁远程屏幕保护程序的人,这个命令是不同的……
loginctl lock-session 1
或者
loginctl unlock-session 1
这假设你的会话是第一个。你可以为屏幕保护程序的启动和停止添加脚本到KDE的通知事件中。希望这些信息能帮助到想要在多台电脑上同步屏幕保护程序的人。
我知道这个回答有点长,但我想给你提供一个可以测试的例子,以及我今天使用它的一个实际案例。