
我正在使用 Kubuntu 20.04 Focal(KDE Plasma v5.18.5、KDE Frameworks v5.68.0、Qt v5.12.8),我有一堆 Bash 脚本,需要向用户发布一些通知,而这是我目前遇到未解决问题的步骤。要发布通知,我使用notify-send
(来自libnotify-bin
包)和kdialog
(来自kdialog
包)。最小、完整且可验证的示例对于我的情况来说看起来像这样(比如,它是/tmp/test.sh
可执行文件):
#!/bin/bash
notify-send "notify-send test"
kdialog --passivepopup 'kdialog test' 5
当您手动运行此脚本时,它会正常工作并产生您期望的结果 - 显示桌面上出现的通知。 在我的情况下,它预计会显示在屏幕的左下角,因为我的左边缘有垂直面板:
但是,当我尝试从 cron 作业运行脚本时,使用如下 crontab 条目:
* * * * * DISPLAY=:0 /tmp/test.sh
notify-send
完全失败(什么都不显示)并且kdialog
显示一些奇怪主题和错误位置的东西(在屏幕的左上角):
cron 作业正在代表我的用户运行,并且我在测试期间被记录下来。检查系统日志时,我看到:
Sep 10 20:05:01 HOST CRON[159928]: (USER) CMD (DISPLAY=:0 /tmp/test.sh)
Sep 10 20:05:15 HOST org.freedesktop.Notifications[159641]: org.kde.knotifications: WaitForName: Service was not registered within timeout
Sep 10 20:05:15 HOST dbus-daemon[76746]: [session uid=1000 pid=76744] Activated service 'org.freedesktop.Notifications' failed: Process org.freedesktop.Notifications exited with status 1
Sep 10 20:05:15 HOST dbus-daemon[76746]: [session uid=1000 pid=76744] Activating service name='org.freedesktop.Notifications' requested by ':1.497' (uid=1000 pid=159930 comm="notify-send notify-send test " label="unconfined")
我一直在寻找,org.kde.knotifications: WaitForName: Service was not registered within timeout
但未能找到任何解释这到底是由什么原因造成的。我怀疑 cron 作业环境缺少某些东西(即环境变量?),而这些东西在从交互式 shell 启动时是存在的,但我不知何故卡住了,不知道下一步该检查什么。因此,古老的帖子建议关闭面板自动隐藏(我没有使用自动隐藏功能)或确保我没有静音托盘中的通知(我的情况也不是)。我在这里确实缺乏一些知识,所以我的问题是 - 是什么真正阻止了通知按预期显示?我知道运行 cron 作业并不等同于用户手动启动,但我未能弄清楚这里真正重要的区别是什么,我应该人为地提供什么。在寻找罪魁祸首的过程中,我接下来应该检查什么?我现在只是没有主意了,而且我在搜索过程中发现的任何东西都不能让我向前迈出任何一步。
我真的很感激任何关于这方面的提示或想法,或者下一步要偷看/阅读/调查什么,因为我目前没有想法。
答案1
我见过其他人成功设置DBUS_SESSION_BUS_ADDRESS
或XDG_RUNTIME_DIR
。
我在本地尝试过,这些在这里运行良好。
* * * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus /tmp/test.sh
或者
* * * * * DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/$(id -u) /tmp/test.sh