从鱼脚本执行通知发送为cronjob

时间:2019-07-12 19:36:16

标签: shell cron fish

我正在尝试将鱼脚本中的通知发送称为cronjob。即使脚本被cron调用,通知也不会在我的显示器上弹出。我不确定它在哪里出现故障,是否正在执行notify-send,是否是shell问题或其他问题。在终端中执行脚本会产生预期的结果(即弹出窗口)

crontab -e -u $USER中:

  SHELL=/bin/fish

  * * * * * memcheck >> /tmp/cron.memcheck.log

运行tail --follow /tmp/cron.memcheck.log表明该脚本正在被调用,因为它正在将调试输出回显到日志文件中,但是却拖后启动notify-send

这是我的(讨厌的)脚本:

# Defined in /home/mio/.config/fish/functions/memcheck.fish @ line 2
function memcheck
    set MEM_USED (free | string replace '3914132' '' | string match 'Mem: [ ]{1,}[0-9]{1,}' --regex | string match '\d$
    #echo $MEM_USED
    set MEM_CAP 3914132
    set MEM_FREE (math $MEM_CAP - $MEM_USED)
    echo $MEM_FREE
    if test $MEM_FREE -lt 8700700
        echo "WARNING: memory usage out of control. 21:10"
        set DISPLAY :0.0
        echo $DISPLAY
        echo $USER
        /usr/bin/notify-send "Memory Usage" $MEM_FREE --urgency=critical
    end
end

我已经读到,在某些情况下,notify-send找不到显示,并且将$DISPLAY设置为:0.0可以解决问题。如果我在终端机中echo $DISPLAY,则得到:0.0。还回显$USER会给我我的用户名,这是我运行cronjob -u mio -e并没有直接编辑/etc/crontab以来的期望值。感谢您的时间。

1 个答案:

答案 0 :(得分:1)

  

如果我在终端中回显$ DISPLAY,则会得到:0.0

是的,但是您的cronjob不在终端中运行。

在Unix中,环境变量在启动时会从父进程传递给子进程。

您的终端内的鱼是该终端的子级,该终端的$ DISPLAY设置为与X联系。

但是您的cronjob由cron守护程序运行,该守护程序通常是init进程的子进程,而init进程没有任何父进程。因此它继承了init的环境。


在脚本中设置$ DISPLAY。这并不漂亮(我不能说我喜欢让cronjob开始发送通知的方法),但是它应该可以工作,至少在具有一台X服务器的典型设置的情况下如此。

请注意,在这种情况下,鱼是完全不相关的-不管您选择什么作为壳,它都会发生。

一些可行的选择(尽管我还没有深入研究它们):

  • 在终端中或通过DE的自动启动机制运行watch作业。这只会每隔X秒重新运行一次,但是有$DISPLAY
  • 使用systemd的计时器资料,尤其是作为用户使用。有一个命令可以将环境变量“上载”到systemd,以便随后可以在计时器中使用它。