我一直在尝试将
notify-send
与 cron 一起使用。我查看了 stackoverflow 和其他论坛上给出的大量答案。但我没有看到通知发送弹出窗口出现。我目前运行的是 Ubuntu 13.10。我已经能够让这个工作更早(大约 3 个月前,当我有 Ubuntu 11.10 时),但我不记得是如何做到的,我也不知道我在这里做错了什么。
我当前的 crontab 看起来像:
*/1 * * * * export DISPLAY=:0.0 && export XAUTHORITY=/home/harold/.Xauthority && /usr/bin/notify-send "$(date)"
我已经尝试了网上提供的许多解决方案,包括在
sudo -u harold
之前使用 /usr/bin/notify-send ...
。我也尝试过使用 export DISPLAY=:0
而不是 =:0.0
。弹出窗口仍然没有出现。
我也尝试过创建一个脚本。运行脚本的 cron 作业如下所示:
*/1 * * * * cd /home/harold/bin && ./notify-send-test.sh
我的脚本 (
notify-send-test.sh
) 看起来像:
#!/bin/bash
#export DISPLAY=:0
#export XAUTHORITY=/home/harold/.Xauthority
/usr/bin/notify-send "$(date)"
echo "trying to notify at $(date)" >> /home/harold/bin/cronlog.txt
我尝试过使用注释行而不是使用它们。这些组合似乎都不起作用。我也尝试过使用
export DISPLAY=0.0
。
我每分钟都会在 cronlog.txt 文件中获得预期的输出。这意味着我的脚本正在执行,但通知发送没有执行。
我想知道我做错了什么。很高兴提供更多可能有用的信息。
第二个问题: 还有一些关于 cron 无法使用某些环境变量的问题。我不明白这意味着什么以及它如何影响我使用 cron 的方式。如果有人能解释这一点那就太好了。
添加到 Sakthi 的答案中。
您可以通过键入 dbus-launch
来获取
DBUS_SESSIONBUS_ADDRESS,而无需使用 nautilus(或 gnome 或其他)(请参阅 此答案)
所以脚本就是:
#!/bin/bash
export $(dbus-launch)
/usr/bin/notify-send "$(date)"
如果这不起作用,您可以尝试将其硬编码到您的用户 ID:
#!/bin/bash
userid=$(id -u)
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$userid/bus"
export DBUS_SESSION_BUS_ADDRESS
/usr/bin/notify-send "$(date)"
您可以在脚本中添加
echo $(env | grep DBUS_SESSION_BUS_ADDRESS)
来检查脚本执行时的env变量是什么。
DBUS_SESSION_BUS_ADDRESS env 变量不会在 cron 守护进程中设置。设置此值将解决您的问题。将以下更改添加到您的 .sh 文件并从 crontab 调用它。
通知发送测试.sh
#!/bin/bash
username=$(/usr/bin/whoami)
pid=$(pgrep -u $username nautilus)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
export DBUS_SESSION_BUS_ADDRESS=$dbus
/usr/bin/notify-send "$(date)"
定时任务
*/1 * * * * /home/harold/bin/notify-send-test.sh
更简单的解决方案是使用本地用户 crontab(不使用 sudo 打开的那个),这样就不需要写下特殊的授权 这适用于 Ubuntu 23.10 :
在 crontab 中:
15 13 * * * env DISPLAY=:1 /home/myscripts/mytask.sh
在你的“mystask.sh”脚本中:
#!/bin/bash
export XDG_RUNTIME_DIR=/run/user/1000 notify-send --urgency=critical "let's have some tea :)"