如何使用 cron 通过通知发送在屏幕上显示消息

如何使用 cron 通过通知发送在屏幕上显示消息

我正在摆弄notify-sendand cron(在 Arch 机器上),但我无法找到将它们结合起来的方法:

我尝试了给出的解决方案这里这里,但都不起作用。我该如何使用它们?

编辑: 我已经在 crontab 中设置了 DISPLAY,但它仍然不起作用。我在 Ubuntu 中尝试了同样的操作,一切正常。这是我的 cron 行:

*/1 * * * * DISPLAY=:0.0 /usr/bin/notify-send "hellp" || echo "er" > .er

答案1

我唯一可以建议的是创建一个命名管道并让 cron 写入该管道,并由会话管理器启动一个小脚本,该脚本从管道读取并调用通知发送:

while read line < /tmp/.cron2notify.s  # pipe name in /tmp
do notify-send "Cron message" "$line"
done

然后在 crontab 中,让程序写入/tmp/.cron2notify.s.

尚未对此进行测试,但应该为您提供一个工作起点。

答案2

我认为这notify-send取决于D-Bus在大多数系统上,联系 dbus 的最常见方法是通过变量$DBUS_SESSION_BUS_ADDRESS。然而,对此进行硬编码crontab可能不太可行,因为每次启动 dbus 的新实例时,总线地址都会发生变化,这通常在您登录或重新启动时发生。阿尔切的解决方案听起来是个不错的解决方法。

答案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 或任何其他窗口管理器。我还指定了一个用户作为第一个参数,因为如果您希望无论谁登录都可以正常工作,它会使其以后更加模块化。

相关内容