2015-09-23 72 views
2

的Cron表达式:壳牌脚本(与顶部命令)中的cronjob不工作

# 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 

当我手动exeute脚本时,得到所需的输出。那就是:

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 

什么可以这样做的原因?

回答

2

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

取代:

topresult=`top -n 1| grep Cpu` 

与:

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

-b:批处理模式操作顶部 '批量模式' 开始,这可能是从顶部发送输出有用到其他程序或文件。 在这种模式下,顶部将不会接受输入并运行,直到迭代 限制您使用'-n'命令行选项设置或直到终止。

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

+0

+1,但它仍然是有趣的学习究竟是什么原因互动之间的差异执行cron。我可以在我的盒子上重现OP的问题,显然,stdin是否连接到tty并不重要,输出是否为管道或重定向并不重要,执行用户似乎也不是问题。 –

+0

我不是专家,但根据我读过的内容,顶部是使用正在使用控制字符操纵屏幕的curses库编写的。不知道在这种环境下标准输出会发生什么。 ncurses的手册页表明它可能会变为stderr:http://linux.die.net/man/3/ncurses *“如果将ncurses程序的标准输出重定向到不是tty的东西,屏幕更新将定向到标准错误。“*您也可以尝试通过设置TERM = dumb来获得更加正常的输出。但底线是批处理模式是你想要使用的。 –

0

你可以使用这个脚本:因为您的解决方案解决了这个问题

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