带有通知发送功能的 Cron

问题描述 投票:0回答:14

我需要显示来自 cron 作业的通知。我的 crontab 是这样的:

$ crontab -l
# m h  dom mon dow   command
  * *   *   *   *    Display=:0.0 /usr/bin/notify-send Hey "How are you"

我检查了

/var/log/syslog
,该命令实际上每分钟都会执行一次,但不会弹出通知。 有人能帮我理解为什么吗?

linux cron notify notify-send
14个回答
118
投票

我在 Ubuntu 18.04 上使用 i3。我解决这个问题的方法是:

* * * * *  XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"

Edit 2020:我仍然在 Ubuntu 20.04 上使用它。


23
投票

我找到了答案:

$ crontab -l
# m h  dom mon dow   command
  * *   *   *   *    export DISPLAY=:0.0 && export XAUTHORITY=/home/ravi/.Xauthority && sudo -u ravi /usr/bin/notify-send Hey "How are you"

7
投票

在 Ubuntu 14.04 中导出显示对我来说不起作用。下面是我用来在笔记本电脑电池电量过低时关闭虚拟机的 cron 脚本。设置 DBUS_SESSION_BUS_ADDRESS 的行是最终使警告正常工作的修改。

#!/bin/bash

# if virtual machine is running, monitor power consumption
if pgrep -x vmware-vmx; then

  bat_path="/sys/class/power_supply/BAT0/"

  if [ -e "$bat_path" ]; then

    bat_status=$(cat $bat_path/status)

    if [ "$bat_status" == "Discharging" ]; then

      bat_current=$(cat $bat_path/capacity)

      # halt vm if critical; notify if low
      if [ "$bat_current" -lt 10 ]; then

        /path/to/vm/shutdown/script
        echo "$( date +%Y.%m.%d_%T )" >> "/home/user/Desktop/VM Halt Low Battery"

        elif [ "$bat_current" -lt 15 ]; then
        eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
        notify-send -i "/usr/share/icons/ubuntu-mono-light/status/24/battery-caution.svg"  "Virtual machine will halt when battery falls below 10% charge."

      fi

    fi

  fi

fi

exit 0

相关线路在这里:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

我在这里找到了解决方案:https://askubuntu.com/a/346580/255814


6
投票

只有这个适合我(Xubuntu)

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME xfce4-session)/environ)"; notify-send  "hello world" 

如果您在 gnome 环境下,则需要将

xfce4-session
更改为
gnome-session

参考:https://askubuntu.com/questions/298608/notify-send-doesnt-work-from-crontab


6
投票

添加

DBUS_SESSION_BUS_ADDRESS

* * * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/notify-send 'helloworld..' 'msg...'


3
投票

在 Fedora 22 上为我工作:

在调用通知发送之前将此行放入 .sh 脚本中:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)"

2
投票

在最新的 Ubuntu 版本上,以下内容应该可以工作。

#notify_me.sh, can be placed e.g. in your home directory

#!/bin/bash
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
# the actual notification
DISPLAY=:0 notify-send "Notify me!"

然后像平常一样通过

crontab
添加一行到用户的 cronjobs 中。


1
投票

简单且简化的答案:

01 * * * * export DISPLAY=:0.0 && notify-send Hey "How are you"

如果您需要

Xauthority
权限,这里有一个使用
$LOGNAME
变量

的通用形式
01 * * * * export DISPLAY=:0.0 && && export XAUTHORITY=/home/$LOGNAME/.Xauthority notify-send Hey "How are you"

正如@tripleee 所指出的,这里并不真正需要 sudo


1
投票

与上面的nmax类似,我也通过设置

DBUS_SESSION_BUS_ADDRESS
环境变量解决了这个问题。 但是,我使用的是 Linux Mint 19 (xfce4) 和 XMonad 的组合,由于某种原因,我没有运行进程
xfce4-session
。相反,我发现
xfce4-terminal
(通常)正在运行,这导致我的脚本开头出现以下行:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME xfce4-terminal)/environ)"

这解决了我的问题。


0
投票

我创建了一个使用 DISPLAY-:0.0 技术的 /usr/bin 脚本 http://pastebin.com/h11p2HtN

它没有考虑 XAUTHORITY。我得进一步调查一下。


0
投票

如果您遇到通知发送脚本在本地工作正常但无法与 cron 作业配合使用的问题,请使用此命令。并将“saurav”替换为您的用户名。

sudo -u saurav DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Your message goes here"

0
投票

就我而言,问题在于将

root
用户与
notify-send
一起使用。当我看到
sudo notify-send
无法在终端上工作而只是
notify-send
(即当前用户)可以工作时,我意识到了这一点。 因此,我没有编辑
/etc/crontab
使用的常用
root
,而是为
myusername
创建了一个自定义 cron 脚本。请检查我的完整答案这里


-1
投票

也许你可以尝试:


 * *   *   *   *    env DISPLAY=:0.0 sudo -u ravi /usr/bin/notify-send Hey "How are you"


-3
投票

在脚本中调用

notify-send
时尝试此操作:

echo "PASSWORD" | sudo -u USER notify-send "your alert message"

© www.soinside.com 2019 - 2024. All rights reserved.