xmessage 和 cron

xmessage 和 cron

简单的 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 用户会话完全启动之前运行您的命令。

还要注意,如果您将命令添加到rootcrontab中,sudo crontab -e那么无论您root在 Ubuntu 上做什么,基于 X 的应用程序都可能无法运行,因为默认情况下无法启动 X 会话。

因此,鉴于上述原因,CRON不是无论如何,这都是运行基于 X 的用户应用程序的首选方式。

否则,我建议你运行基于 X 的脚本/命令启动应用程序... 请参见启动脚本未执行以了解类似问题以及可能的解决方法。

另外,请参阅电池充满指示器 22.04这是一个可以在启动应用程序中而不是 cronjob 中使用的电池监控脚本的示例。

相关内容