crontab 中的 Notify-send 功能无法运行

crontab 中的 Notify-send 功能无法运行

我编写了一个脚本,当我正在阅读的漫画有新章节时,它会通知我。我使用命令notify-send来执行此操作。当我尝试在终端中运行该程序时,该程序可以正常工作。通知正在显示。但是,当我将其放在我的crontab中时,通知没有显示。我很确定该程序正在运行,因为我创建它是为了给我创建一个文件。文件已创建,但通知未显示。

这是我的脚本

#!/bin/bash   
#One Piece Manga reminder    
#I created a file named .newop that contains the latest chapter.    
let new=$(cat ~/.newop)    
wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html

if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 ))    
then    
    (( new+=1 ))    
    echo $new    
    echo $new > ~/.newop    
    notify-send "A new chapter of One Piece was released."    
else    
    notify-send "No new chapter for One Piece."    
    notify-send "The latest chapter is still $new."    
fi        
exit

这是我在 crontab 中写的内容

0,15,30,45 12-23 * * 3   /home/jchester/bin/opreminder.sh

答案1

至少在 Gnome Shell 中,13.04 上的情况似乎有所不同。

首先,这是从用户(不是 root)的 cron 作业env运行时打印的内容:zzyxy

HOME=/home/zzyxy
LOGNAME=zzyxy
PATH=/usr/bin:/bin
XDG_RUNTIME_DIR=/run/user/zzyxy
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/zzyxy

为了开始notify-send工作,似乎需要设置DBUS_SESSION_BUS_ADDRESS环境变量,如下DahitiF 的评论在 ubuntuforums.org 上。只需将以下内容添加到您的实际工作描述中即可:

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

好像没必要设置DISPLAY

答案2

当由 cron 启动时,命令notify-send不会在屏幕上显示消息。只需在脚本顶部添加目标显示,例如:

export DISPLAY=:0

答案3

命令需要引用其位置。因此notify-send需要/usr/bin/notify-send

所有命令都需要有其完整路径。

使用whereis notify-send命令查看命令“驻留”的位置

答案4

至少对于 Ubuntu 14.04,上述 klrmr 的回复是正确的答案。似乎没有必要设置 DISPLAY 或明确说明通知发送的完整路径或 $PATH 中通常包含的任何其他内容。

下面是一个 cron 脚本,我用它来在笔记本电脑电池电量过低时关闭虚拟机。上述 klrmr 的响应中设置 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

相关内容