“tput:$TERM 没有值且未指定 -T”由 CRON 进程记录的错误

问题描述 投票:0回答:4

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

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

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

linux shell unix cron tput
4个回答
19
投票

脚本中的某些内容正在调用

tput
二进制文件。
tput
尝试检查
$TERM
变量以确定当前终端,以便它可以生成正确的控制序列。 cron 运行时没有终端,因此您会从
tput
得到该错误。

您可以手动为 cron 作业分配一个

TERM
值(可能是
dumb
或类似的东西)或者(这可能是更好的解决方案)您可以找出正在调用
tput
的内容并删除该调用.


17
投票

cron 守护进程由“root”用户在其自己的 shell 中运行。默认情况下,cron 将附加发送给运行脚本的用户的系统邮件(这就是为什么您在系统邮件中看到发件人为“root”)。 “用户”是您在设置 crontab 时登录的用户。该邮件将包含控制台和错误消息。在 Ubuntu 上,可以在

/var/mail/<username>
查看邮件文件。

如果没有设置

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

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

MAILTO
 设置 
MAILTO=""

变量

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

MAILTO=""
TERM=xterm

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

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


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


0
投票

只需将这些行中的任何一行放置在第一个

tput
出现之前:

tty -s; [ $? -ne 0 ] && TERM=dumb

TERM="${TERM:-dumb}"
© www.soinside.com 2019 - 2024. All rights reserved.