答案1
我唯一可以建议的是创建一个命名管道并让 cron 写入该管道,并由会话管理器启动一个小脚本,该脚本从管道读取并调用通知发送:
while read line < /tmp/.cron2notify.s # pipe name in /tmp
do notify-send "Cron message" "$line"
done
然后在 crontab 中,让程序写入/tmp/.cron2notify.s
.
尚未对此进行测试,但应该为您提供一个工作起点。
答案2
答案3
我尝试使用 Arcege 的答案,但无法使其工作: while 循环在第一行写入命名管道后终止。对我有用的是有一个带有无限循环的类似脚本,其中我捕获从 cron 发送的信号,然后调用 notification-send。以下是“notify-forward”程序:
#! /bin/bash
function coffee () {
notify-send "foo" "bar"
}
function lunch () {
notify-send "bar" "foo"
}
while true; do
sleep 10
trap coffee SIGUSR1
trap lunch SIGUSR2
done
我的 crontab 看起来像
55 09,13 * * * pkill -USR1 forward-notify
55 11 * * * pkill -USR2 forward-notify
答案4
我真的建议使用包装脚本。为了模拟 cron 调用 notification-send,我使用“ssh localhost”登录到我自己的系统。调用 '/usr/bin/notify-send "foo"' 不起作用,并且在将 DISPLAY=:0.0 添加到该行时我没有运气。这是有效的:
DBUS_SESSION_BUS_ADDRESS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/`pgrep -u username cinnamon|head -1`/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')" /usr/bin/notify-send "foo"
至少可以说,这非常混乱。这更干净。
#! /bin/bash
DBUS=$(pgrep -ou $1 cinnamon)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')"
DBUS_SESSION_BUS_ADDRESS="$DBUS" /usr/bin/notify-send $2
在 cron 中:
*/1 * * * * /path/to/notify.sh user "help"
请注意,“肉桂”位在那里是因为我使用的窗口管理器。您可能必须将其替换为 nautilus 或任何其他窗口管理器。我还指定了一个用户作为第一个参数,因为如果您希望无论谁登录都可以正常工作,它会使其以后更加模块化。