2015-09-23 118 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