2

我正在尝试从 cron 作业向 KDE 的节点发送通知。下面的代码工作正常,但是当我将它作为 cron 作业运行时,通知不会出现。

#!/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")

有人知道我如何将其作为 cron 作业运行吗?

4

1 回答 1

2

您需要提供一个名为DBUS_SESSION_BUS_ADDRESS.

您可以从正在运行的 kde 会话中获取值。

$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-iHb7INjMEc,guid=d46013545434477a1b7a6b27512d573c

在您的 kde 启动(配置中的自动启动模块)中,创建一个脚本条目以在您的环境启动后运行。将此环境变量值输出到主目录中的临时文件,然后您可以在 cron 作业或临时文件中的 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

qdbus-qt5如果您仍然安装了旧的 kde4 二进制文件和 kde5,则可能需要使用。您可以确定应该使用以下哪个:

export QDBUS_CMD=$(which qdbus-qt5 2> /dev/null || which qdbus || exit 1)

当我想阻止我的屏幕保护程序使用时,我会使用 sleep 语句运行它并且它可以工作。我从主计算机旁边的另一台计算机远程运行它。

对于那些想知道我如何锁定和解锁远程屏幕保护程序的人来说,这是一个不同的命令......

loginctl lock-session 1

或者

loginctl unlock-session 1

那是假设您的会话是第一个会话。您可以将脚本添加到屏幕保护程序启动和停止的 KDE 通知事件。希望此信息对想要在多台计算机上同步屏幕保护程序的人有所帮助。

我知道这是一个很长的答案,但我想提供一个示例供您测试,以及我今天使用它的实际用例。

于 2013-03-02T15:28:41.823 回答