【问题标题】:Cron with notify-send带有通知发送的 Cron
【发布时间】:2023-04-04 09:57:01
【问题描述】:

我需要显示来自 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


    【解决方案1】:

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

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

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

    【讨论】:

    • 可以确认这在 Ubuntu 18.04 上有效,而接受的答案没有。
    • 可以确认这在 Ubuntu 20.04 上有效,但确认的答案没有。
    • 这应该是现在确定的答案。我下意识地直接找到了没有用的公认答案,因此最初错过了有效的解决方案。
    【解决方案2】:

    我找到了答案:

    $ 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"
    

    【讨论】:

    • 只需添加“export DISPLAY=:0.0”就可以了。也就是说,cronjob 正在我的用户帐户下运行。当从与弹出窗口需要出现的帐户不同的帐户运行时,可能需要 XAUTHORITY。谢谢。
    • 谢谢,这对我也有帮助(我不需要使用“sudo”)
    • 我也是。我可以将此命令减少到 * * * * * export DISPLAY=:0.0 && notify-send Hey "How are you"
    • 可以进一步简化为* * * * * DISPLAY=:0.0 notify-send Hey "How are you"
    • @DrunkenMaster 我刚刚在 18.04 尝试过这个;为我工作。 crontab 是我自己的(不是 root 的)* * * * * export DISPLAY=:0.0 && notify-send -t 10000 Hey Hey
    【解决方案3】:

    在 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

    【讨论】:

    • 我使用archlinux,它为gnome-session使用不同的进程,但仍然使用字符串gnome-session作为长标志。因此需要将-f 添加到pgrep 调用中。
    【解决方案4】:

    只有这对我有用(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

    【讨论】:

    • 从 ubuntu 17.10 开始,我相信您需要寻找 gdm-x-session。这是我使用的线路:eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gdm-x-session)/environ)"
    【解决方案5】:

    添加DBUS_SESSION_BUS_ADDRESS

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

    【讨论】:

      【解决方案6】:

      在 Fedora 22 上为我工作:

      在调用 notify-send 之前将此行放在 .sh 脚本中:

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

      【讨论】:

        【解决方案7】:

        在最近的 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 中添加一行。

        【讨论】:

          【解决方案8】:

          简单而精简的答案:

          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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              类似于上面的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)"
              

              这为我解决了这个问题。

              【讨论】:

                【解决方案11】:

                如果您遇到的问题是您的 notify-send 脚本在本地运行良好,但它不适用于 cron 作业,请使用此命令。并将“saurav”替换为您的用户名。

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

                【讨论】:

                  【解决方案12】:

                  也许你可以试试:

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

                  【讨论】:

                  • 投反对票:cron 作业已经以 ravi 运行,因此 sudo 不会在此处添加任何有用的内容。
                  【解决方案13】:

                  当您在脚本中调用 notify-send 时试试这个:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-07-29
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-09-24
                    • 1970-01-01
                    • 2017-02-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多