作为 cronjob 从 fish 脚本执行通知发送

Executing notify-send from fish script as cronjob

我正在尝试从 fish-script 调用 notify-send 作为 cronjob。尽管 cron 正在调用脚本,但通知不会在我的显示器上弹出。我不确定它失败的地方,是否正在执行通知发送,如果它是 shell 问题或其他问题。在终端中执行脚本会产生预期的(即弹出window)结果

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。谢谢你的时间。

if I echo $DISPLAY in my terminal I get :0.0

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

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

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

但是您的 cronjobs 是由您的 cron 守护进程 运行 执行的,它通常是您的 init 进程的子进程,而 init 进程又没有任何父进程。所以它继承了init的环境。


在脚本中设置 $DISPLAY。这不是很漂亮(而且我不能说我喜欢有一个发送通知的 cronjob 的方法),但它应该可以工作,至少如果你有一个 X 服务器的典型设置。

请注意,在这种情况下,fish 完全不相关 - 无论您选择什么,它都会发生 shell。

一些可能的替代方案(虽然我没有深入研究):

  • 运行 在终端中或通过 DE 的自动启动机制执行 watch 作业。这只是每 X 秒重新运行s 东西,但是有 $DISPLAY
  • 使用 systemd 的定时器功能,尤其是作为用户。有一个命令 "upload" systemd 的环境变量,因此它可以在计时器中使用它。