Shell 作为cronjob从fish脚本执行notify send
我正在尝试将fish脚本中的notify send作为cronjob调用。即使cron正在调用脚本,通知也不会在我的显示器上弹出。我不确定它在哪里失败,是否正在执行notify send,是否是shell问题或其他问题。在终端中执行脚本会产生预期结果(即弹出窗口) 在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.
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的自动启动机制运行
作业。这只是每隔X秒重新运行一次,但有watch
$DISPLAY
- 使用systemd的计时器,尤其是作为用户。有一个命令将环境变量“上传”到systemd,这样它就可以在计时器中使用它
: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