【问题标题】:Shell script (with top command) not working in cronjobShell 脚本(使用 top 命令)在 cronjob 中不起作用
【发布时间】:2016-02-16 08:05:09
【问题描述】:

Cron 表达式:

# m h dom mon dow command */1 * * * * /home/sysadmin/sample.sh

Shell 脚本内容:

#!/bin/bash
clear
Vardate=`date`
topresult=`top -n 1| grep Cpu`
# CPUStatus=$Vardate"\t"$topresult
# echo $CPUStatus >> /tmp/data.log
echo $Vardate"   "$topresult >> /tmp/data.log

当我手动执行脚本时,我得到了所需的输出。即:

Wed Sep 23 02:42:47 MDT 2015   Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

但是当cronjob执行时,输出如下:

Wed Sep 23 02:42:47 MDT 2015 

这可能是什么原因?

【问题讨论】:

    标签: linux bash shell cron crontab


    【解决方案1】:

    使用top的“批处理”模式。

    替换:

    topresult=`top -n 1| grep Cpu`
    

    与:

    topresult=`top -b -n 1| grep Cpu`
    

    -b : 批处理模式操作 在“批处理模式”中启动顶部,这对于将输出从顶部发送到其他程序或文件可能很有用。 在这种模式下,top 将不接受输入并运行直到迭代 您使用“-n”命令行选项设置的限制或直到被杀死。

    来源:http://linux.die.net/man/1/top

    【讨论】:

    • +1 因为您的解决方案解决了问题,但了解导致交互式执行和 cron 执行之间差异的真正原因仍然很有趣。我可以在我的盒子上重现 OP 的问题,显然 stdin 是否连接到 tty 无关紧要,输出是管道还是重定向都无关紧要,执行用户似乎也不是问题.
    • 我不是专家,但据我所知,top 是使用curses 库编写的,该库使用控制字符来操作屏幕。不确定在这种环境下标准输出会发生什么。 ncurses 的手册页表明它可能会转到 stderr:linux.die.net/man/3/ncurses “如果 ncurses 程序的标准输出被重定向到不是 tty 的东西,屏幕更新将被定向到标准错误。” 你也可以尝试通过设置 TERM=dumb 来获得更正常的输出。但底线是批处理模式是您想要使用的。
    【解决方案2】:

    你可以使用这个脚本:

    export TERM=xterm
    FILE_NAME=top-$(date +%Y%m%d).log
    top -b -n 1 >> /home/ec2-user/$FILE_NAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      相关资源
      最近更新 更多