![xmessage 和 cron](https://linux22.com/image/950988/xmessage%20%E5%92%8C%20cron.png)
简单的 cron bash 脚本,使用 xmessage 提醒用户注意特定情况。当我运行它时,它工作正常,并且完全符合预期,但是当我通过 cron 启动它时,我在 syslog 中看到:
(CRON) info (No MTA installed, discarding output)
我究竟做错了什么?
预计到达时间:代码如下:
#!/bin/bash
#
# script to capture current battery percentage and display in an alert dialog box
# displays alert only if percentage is less than 10%
export DISPLAY=":0"
percentage=$(upower -i $(upower -e | grep '/battery') | grep --color=never -E percentage|xargs|cut -d' ' -f2|sed s/%//)
if [[ $percentage -lt 99 ]]
then
xmessage -buttons Ok:0 -geometry 500X500 -nearmouse "BATTERY IS AT $percentage%" -timeout 30
fi
除非执行 xmessage 行,否则我不会收到 MTA 错误。PS,是的,10% 和 99% 不匹配,我将其设置为 99 以进行故障排除。
答案1
信息消息:
(CRON) info (No MTA installed, discarding output)
这不是你的问题...它只是意味着你的 crnjob 导致了一个输出,你没有提供重定向/处理它的方法(注意:该输出可能包含一些有用的信息,也许您应该将其重定向到文件以供稍后检查。) 并且在这种情况下 CRON 尝试通过电子邮件发送输出,但由于缺少 MTA 而无法成功(邮件传输代理)...这完全是正常现象,安装 MTA 不会让您的 cronjob 执行得更好...请参阅Cron 作业日志显示“未安装 MTA”,这会阻止 CRON 作业完成吗?
你的问题很可能是xmessage
是一个基于 X 的应用程序,它需要已经在运行的 X 服务器用户会话以及指定的显示接口/服务器...如果您的 cronjob 保证在 X 服务器用户会话已经运行时运行,否则就不能运行,那么您可以在 crontab 中的命令之前找到并指定显示接口/服务器的地址作为环境变量,从而使它工作,例如像这样:
* * * * * DISPLAY=":0" your_command ...
您可以在用户 X 会话运行时查看当前环境$DISPLAY
变量,例如:
echo $DISPLAY
尽管如此,在@reboot
指定了例如或者用户在 CRON 运行您的命令时由于某种原因退出了他们的会话的情况下,CRON 可能会在 X 用户会话完全启动之前运行您的命令。
还要注意,如果您将命令添加到root
crontab中,sudo crontab -e
那么无论您root
在 Ubuntu 上做什么,基于 X 的应用程序都可能无法运行,因为默认情况下无法启动 X 会话。
因此,鉴于上述原因,CRON不是无论如何,这都是运行基于 X 的用户应用程序的首选方式。
否则,我建议你运行基于 X 的脚本/命令启动应用程序... 请参见启动脚本未执行以了解类似问题以及可能的解决方法。
另外,请参阅电池充满指示器 22.04这是一个可以在启动应用程序中而不是 cronjob 中使用的电池监控脚本的示例。