Shell 作为cronjob从fish脚本执行notify send

Shell 作为cronjob从fish脚本执行notify send,shell,cron,fish,Shell,Cron,Fish,我正在尝试将fish脚本中的notify send作为cronjob调用。即使cron正在调用脚本,通知也不会在我的显示器上弹出。我不确定它在哪里失败,是否正在执行notify send,是否是shell问题或其他问题。在终端中执行脚本会产生预期结果(即弹出窗口) 在crontab-e-u$USER中: SHELL=/bin/fish * * * * * memcheck >> /tmp/cron.memcheck.log 运行tail--follow/tmp/cron.

我正在尝试将fish脚本中的notify send作为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

这是我的(noobish)脚本:

我已经了解到,在某些情况下,
notify send
找不到显示,将
$display
设置为
:0.0
可能会起作用。如果我在我的终端中
echo$DISPLAY
,我得到
:0.0
。同时,回显
$USER
会给我提供我的用户名,这是我运行
cronjob-umio-e
而没有直接编辑
/etc/crontab
时所期望的。谢谢你抽出时间

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

是的,但是你的cronjob没有在你的终端上运行

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

终端中的鱼是该终端的子对象,该终端将$DISPLAY设置为contact X

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


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

请注意,在这种情况下,鱼是完全不相关的——无论你选择什么作为贝壳,它都会发生

一些看似合理的替代方案(尽管我还没有深入研究):

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

谢谢你的帮助。我确实在脚本中设置了$DISPLAY变量(我将从我的普通终端返回的字符串复制到脚本中的$DISPLAY变量中),但它似乎不会影响任何事情。我尝试了
:0.0
:0
以及其他一些变体。是否
notify send
需要发送另一个环境变量?是否可以从notify send获取某种调试信息?在任何情况下,我都会尝试通过cron将notify send封装在bash脚本中,看看会发生什么……它必须导出。您是否使用
set-x
# 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