Linux

Crontab - 將 StdErr 發送到電子郵件並將 stdOut 發送到日誌文件

  • September 3, 2020

在我的 crontab 中,我正在嘗試使用自定義主題標題將標準輸出發送到日誌文件並將標準錯誤發送到電子郵件帳戶。

我嘗試了許多解決方案,但沒有達到我的最初目標,讓我解釋一下:

第一種方法:使用 MAILTO

MAILTO=my.email@address.com
*/1 * * * * /my/script.sh > /my/file_stdout.log

這會將標準輸出發送到日誌文件並將錯誤發送到電子郵件,但缺點是我無法弄清楚如何更新電子郵件主題,因此我得到的是主題:Cron /my/script.sh > /my/file_stdout。日誌

第二種方法:使用郵件

我玩弄了很多使用郵件的方法,但沒有一個像我想要的那樣工作:

*/1 * * * * /my/script.sh > /my/file_stdout.log 2>&1; [ $? != 0 ] && mail -s "Subject here" my.email@address.com < /my/file_stdout.log

另一個 :

*/1 * * * * /my/script.sh > /my/file_stdout.log 2>&1 || mail -s "Subject here" my.email@address.com < /my/file_stdout.log

另一個 :

*/1 * * * * /my/script.sh 2>&1 | tee /my/file_stdout.log | mail -s "Subject here" my.email@address.com < /my/file_stdout.log

另一個:

*/1 * * * * OUTPUT=`/my/script.sh 2>&1` || echo "$OUTPUT" | mail -s "Subject here" my.email@address.com

另外我注意到 or 運算符||在我的 crontab 中不起作用,我什至將 crontab 的 shell 更改為 /bin/bash (通過添加 SHELL=/bin/bash 變數)。

我在 Redhat 企業伺服器上,沒有管理員訪問權限,所以我無法安裝慢性等工具!

我終於讓它工作了,發現了||操作符的問題,腳本總是返回程式碼 0,所以現在我return在腳本末尾明確添加了一條語句,現在按預期工作:

*/1 * * * * (/my/script.sh > /my/file_stdout.log 2>&1) || mail -s "Subject here" my.email@address.com < /my/file_stdout.log

引用自:https://serverfault.com/questions/1032534