!/bin/sh -xv

!/bin/sh -xv

我使用的是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

有幾件事要嘗試。

  1. !/bin/sh -xv

  2. 嘗試使用兩個大於號 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)

相關內容