2015-09-22 40 views
0

我寫了一個shell腳本,它檢查存儲設備中的文件系統並將輸出郵寄到特定的電子郵件。當我手動執行它時,它運行良好,我正在收到有效內容的電子郵件。但是,當我將它放在cronjob中爲同一個用戶時,它正在發送空郵件。我無法找出遺漏的東西。即使我爲root用戶安排了cronjob,同樣的問題仍然存在。下面是我的腳本:Cronjob調用Shell腳本發送空郵件

$ cat qmon.sh 
nas_fs -list \ 
| grep -v ckpt_ \ 
| grep -v root_ \ 
| awk '{print $6}' >filesystem_list 
for i in `cat filesystem_list` 
do 
    nas_quotas -report -tree -fs $i \ 
    | egrep -i -B18 'mins|day|exp' >>quota_exp 
done 
cat quota_exp \ 
| mail -s "FF VNX01 Quota report" [email protected] 
cat /dev/null >quota_exp 
+0

我懷疑的是,這些車票甚至filesystem_list的位置在什麼地方之一,東西取決於失去了一個環境變量。通常它是'$ HOME''。在qmon.sh中添加更多輸出以幫助診斷,例如在''for i''之前,執行''echo looping through list''等。 –

+0

如果結束行,則不需要反斜槓用'|'; shell會知道該命令在下一行繼續,因爲命令不能以管道結束。 – chepner

+0

不要[使用for循環遍歷文件](http://mywiki.wooledge.org/BashFAQ/001)。 – chepner

回答

0

你,你(或運行作業的用戶)沒有權限寫入quota_exp文件的文件夾中運行它。你可以寫在/tmp,像

nas_fs -list |grep -v ckpt_ |grep -v root_ |awk '{print $6}' >/tmp/filesystem_list 
for i in `cat /tmp/filesystem_list`; 
do nas_quotas -report -tree -fs $i |egrep -i -B18 'mins|day|exp' >>/tmp/quota_exp; done 
cat /tmp/quota_exp |mail -s "FF VNX01 Quota report" [email protected] 
rm /tmp/quota_exp 
rm /tmp/filesystem_list 
1

首先,你爲什麼不使用cron的內置郵件功能? 只要cronjob產生任何輸出,它就會發送給每個電子郵件運行作業的用戶。

這也是偉大的調試,因爲它thie電子郵件可能會給你暗示了什麼問題(例如cron的找不到qmon.sh腳本;或者,它沒有權限來運行它...)。 因此,首先要做的是檢查cronttab用戶是否已經收到了一些電子郵件!

然後你就可以直接使用郵件功能,以取代您的來電mail:只需設定crontab的用戶的電子郵件重定向到所需的地址。

關於腳本:

  • 這是很好的做法,以一個認領添加到腳本,所以很明顯這解釋應該運行它(#!/bin/sh
  • 您使用了大量的臨時文件沒有很好的理由,所以儘量使用管道,而不是文件:

這是你的腳本的修訂版本:

$ cat qmon.sh 
#!/bin/sh 

nas_fs -list  \ 
| grep -v ckpt_ \ 
| grep -v root_ \ 
| awk '{print $6}' \ 
| while read fs 
do 
    nas_quotas -report -tree -fs "${fs}" \ 
    | egrep -i -B18 'mins|day|exp' 
done 

如果您在手動發送郵件堅持,只是追加| mail -s "FF VNX01 Quota report" [email protected]到最終done