作为 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 的环境变量,因此它可以在计时器中使用它。
我正在尝试从 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 的环境变量,因此它可以在计时器中使用它。