1. 程式人生 > >mailx定時任務不能執行

mailx定時任務不能執行

要用到Crontab定時任務去執行一個Shell指令碼監控Linux系統資源並且當一些數字超過預設的話傳送郵件警告。首先是linux的sendmail功能無法滿足我們使用SMTP伺服器並且指定傳送者(E.g. [email protected])的郵箱。查了下發現mailx可以跨過系統原來的sendmail服務透過登入外部SMTP來發郵件,不過Redhat5自帶的mailx版本有問題,只好升級到最新的版本mailx-12.4而且關閉sendmail服務。(具體可以參照http://url.cn/UroamQ

裝完之後mailx命令列就可以傳送郵件了。開始折騰Shell指令碼,但是發現通過命令執行該Shell檔案的時候監控結果可以傳送郵件,可是通過Crontab做成定時的任務,卻跑了之後沒有郵件傳送。查google查百度後發現,crontab是不會預設的從使用者profile檔案中讀取環境變數引數,經常導致在手工執行某個指令碼時是成功的,但是到crontab中試圖讓它定期執行時就是會出錯。

 

於是乎把Shell裡面用到的所有路徑都該成絕對路徑,但還是不行。而且發現Crontab執行傳送郵件命令的時候,總有以下報錯:

[email protected]... Connecting to [127.0.0.1] via relay...

[email protected]... Deferred: Connection refused by [127.0.0.1]

手動跑這個shell就沒這個報錯。以為是要把SMTP伺服器加進/etc/hosts. 加了卻也一樣報錯。

 

記得這個錯誤資訊應該是之前sendmail服務沒開啟時候執行Mail (不是Mailx)命令出現過。 所以開始懷疑是crontab用錯了Mail而非Mailx, 有點眉目就簡單了。

在Shell裡把crontab執行時的Path echo出來再跟手動執行時候的Path做個對比:

一比就知道問題可能出在哪裡了,手動執行的Path裡面,/usr/local/bin在前/bin在後,而crontab執行時Path裡面/bin在前面。

再進去/bin裡面看下mailx,發現原來是link到sendmail的mail去了。難怪crontab總呼叫sendmail來跑

[[email protected] xxxxxxxx bin]# ls -latr mailx

lrwxrwxrwx 1 root root 4 Jan  1  2012 mailx -> mail

[[email protected] xxxxxxxx bin]#

 

知道問題就容易解決了,在shell裡面加入export PATH=/usr/local/bin:$PATH (等於把/usr/local/bin 和/bin對調,讓/usr/local/bin裡面的mailx被呼叫)

測試了下能收到郵件!事實證明crontab跑指令碼還是要很小心的。特別是會呼叫到java或者第三方程式的crontab。