25

我们有一个由 CRON 运行的 shell 脚本。shell 脚本依次运行 python 脚本,该脚本从 FTP 服务器下载文件,然后在这些文件上运行 java 日志处理器。这个过程运行得很好,除了我继续收到 CRON 电子邮件,即使没有错误。至少,我认为没有错误。cron 电子邮件有两行,其中一行是

tput: No value for $TERM and no -T specified

经过一番研究,我发现这与设置 $TERM 变量有关。我不确定,该怎么做。任何帮助,将不胜感激。谢谢!

4

3 回答 3

14

cron 守护程序由“root”用户在其自己的 shell 中运行。默认情况下,cron 将附加发送给运行脚本的用户的系统邮件(这就是您在系统邮件中将发件人视为“root”的原因)。“用户”是您在设置 crontab 时登录的用户。该邮件将包含控制台和错误消息。在 Ubuntu 上,邮件文件可在/var/mail/<username>.

如果没有设置变量,cron 将在邮件文件中$TERM发出错误。tput: No value for $TERM and no -T specified要停止这些错误,请在 crontab中使用(或系统中的另一个可用终端,如)设置$TERM变量。该命令将显示当前系统上的 terminfo 定义。如果您缺少该命令,您可以在大多数 Linux 系统上看到原始数据。TERM=dumbxtermtoe/usr/share/terminfo

即使您已停止错误,您仍可能会收到带有控制台消息的附加系统邮件。随着时间的推移,此文件将像日志一样填满,因此您可能希望停止这些消息。要停止 cron 系统邮件,请MAILTO使用MAILTO=""

所以你的 crontab 可能看起来像:

MAILTO=""
TERM=xterm

* * * * * sh /path/to/myscript.sh

您可以使用“crontab -l”查看 crontab(对于您登录的用户)。

于 2016-03-05T00:32:28.190 回答
13

脚本中的某些内容正在调用tput二进制文件。tput尝试检查$TERM变量以确定当前终端,以便它可以产生正确的控制序列。cron 运行时没有终端,因此您从tput.

您可以手动TERM为 cron 作业分配一个值(可能dumb或类似的东西),或者(这可能是更好的解决方案)您可以找出正在调用的内容tput并删除该调用。

于 2015-05-01T01:27:48.693 回答
1

--> 我的 TPUT 问题的工作解决方案:


# when $TERM is empty (non-interactive shell), then expand tput with '-T xterm-256color'
[[ ${TERM}=="" ]] && TPUTTERM='-T xterm-256color' \
                  || TPUTTERM=''

declare -r    RES='tput${TPUTTERM} sgr0'       REV='tput${TPUTTERM} rev'
declare -r    fRD='tput${TPUTTERM} setaf 1'    bRD='tput${TPUTTERM} setab 1'
declare -r    fGN='tput${TPUTTERM} setaf 2'    bGN='tput${TPUTTERM} setab 2'
...
echo ${fRD}" RED Message: ${REV} This message is RED REVERSE. "${RES}
echo ${fGN}" GREEN Message: ${REV} This message is GREEN REVERSE. "${RES}
...

这样,如果有交互式或非交互式 shell 是没有意义的 - tput 仍然可以正常工作。

6a5h4

于 2021-06-03T23:24:00.683 回答