【问题标题】:"tput: No value for $TERM and no -T specified " error logged by CRON process“tput: No value for $TERM and no -T specified” CRON 进程记录的错误
【发布时间】:2015-07-10 21:03:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux shell unix cron tput


    【解决方案1】:

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

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

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

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

    MAILTO=""
    TERM=xterm
    
    * * * * * sh /path/to/myscript.sh
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我调用了其他库,它们可能正在调用 tput。我会尝试分配一个 TERM 值,看看是否能解决它
      • 谢谢!我只是按照您的建议将 TERM 变量设置为“哑”,这很有效!
      • @Seagull 无论调用tput 都是假设终端可用于输出。 Cron 作业在没有终端的情况下运行。如果设置 TERM=dumb 有效,那很好,但您可能想考虑调查为什么调用 tput。我可以想象不正确的假设会导致其他问题。
      【解决方案3】:

      --> 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

      【讨论】:

        猜你喜欢
        • 2018-07-10
        • 1970-01-01
        • 2013-06-29
        • 2021-08-28
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多