我们有一个由 CRON 运行的 shell 脚本。 shell 脚本依次运行一个 python 脚本,该脚本从 FTP 服务器下载文件,然后对这些文件运行 java 日志处理器。该过程运行得很好,只是即使没有错误,我也会不断收到 CRON 电子邮件。至少,我认为没有错误。 cron 电子邮件有两行,其中一行是
tput: No value for $TERM and no -T specified
经过一番研究,我发现这与设置 $TERM 变量有关。我不确定该怎么做。任何帮助,将不胜感激。谢谢!
脚本中的某些内容正在调用
tput
二进制文件。 tput
尝试检查 $TERM
变量以确定当前终端,以便它可以生成正确的控制序列。 cron 运行时没有终端,因此您会从 tput
得到该错误。
您可以手动为 cron 作业分配一个
TERM
值(可能是 dumb
或类似的东西)或者(这可能是更好的解决方案)您可以找出正在调用 tput
的内容并删除该调用.
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(针对您登录的用户)。
# 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
只需将这些行中的任何一行放置在第一个
tput
出现之前:
tty -s; [ $? -ne 0 ] && TERM=dumb
或
TERM="${TERM:-dumb}"