我正在尝试将鱼脚本中的通知发送称为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
以来的期望值。感谢您的时间。
答案 0 :(得分:1)
如果我在终端中回显$ DISPLAY,则会得到:0.0
是的,但是您的cronjob不在终端中运行。
在Unix中,环境变量在启动时会从父进程传递给子进程。
您的终端内的鱼是该终端的子级,该终端的$ DISPLAY设置为与X联系。
但是您的cronjob由cron守护程序运行,该守护程序通常是init进程的子进程,而init进程没有任何父进程。因此它继承了init的环境。
在脚本中设置$ DISPLAY。这并不漂亮(我不能说我喜欢让cronjob开始发送通知的方法),但是它应该可以工作,至少在具有一台X服务器的典型设置的情况下如此。
请注意,在这种情况下,鱼是完全不相关的-不管您选择什么作为壳,它都会发生。
一些可行的选择(尽管我还没有深入研究它们):
watch
作业。这只会每隔X秒重新运行一次,但是有$DISPLAY