我使用的是centos 7.0/6.5。 /etc/cron.hourly/mail.cron 的內容
#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log
/var/log/mail.cron.log 的結果
myhost Mon Jul 28 11:01:01 CST 2014
但是,我收到一封空電子郵件,主題正確。所以,我手動測試這個 cron。我收到了正確的電子郵件內容。
myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014
這是相關日誌/var/日誌/cron
Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron
我想知道如何調試這個問題。
答案1
有幾件事要嘗試。
!/bin/sh -xv
- 嘗試使用兩個大於號 2>>&1 重定向 stderr 。
第一個將為您提供腳本的逐步輸出。我會先嘗試一下,而不將 stderr 重定向到您的日誌檔案。 Cron 應該將輸出的副本郵寄給您。你可以準確地看到哪裡出了問題。
第二。也許你有一個錯誤正在破壞你的標準輸出? (可能不是,它的工作方式與 CentOS 6.5 中的一樣。)
您也可以使用 cat 檢查不可列印的字元。
cat -vet /etc/cron.hourly/mail.cron
還可以嘗試的另一件事是使用命令的絕對路徑,/bin/echo 而不是 echo,/bin/date 而不是日期,/bin/hostname 而不是主機名稱。 (ymmv) Jim 在 cron 中的說法絕對正確,並不總是使用與相同互動式使用者完全相同的環境。
答案2
根據您的評論,您確信該cron
作業有效 - 但是,您已經在登入時手動執行該作業進行了測試。問題是,執行的作業cron
不考慮當前使用者的設定和環境變量,因此您可能需要.bash_profile
在腳本中發送電子郵件之前為使用者取得設定檔。
將您的腳本更改為:
#!/bin/sh
source $HOME/.bash_profile # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log
cron
對你的 shell 一無所知——它是由系統啟動的,所以它有一個最小的環境。如果您希望它能夠找到您的程序或運行系統中安裝的實用程序,您必須先讓它知道這些程序的位置,並且您可以透過.profile
在腳本開頭設定變數來做到這一點。
一些有用的連結:
答案3
我看到您得到了一些答案,但沒有明確的工作答案。對我有用的是這樣設定 cron:
*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Cron 腳本輸出"[電子郵件受保護];菲)
這會捕獲輸出並將其發送到郵件,如果沒有它,即使在腳本中運行,我也會收到一封空電子郵件。 (感謝 colucix)