Linux
用於文件和電子郵件的 Cronjob stderr
我需要我的 cronjobs 仍然繼續在某些文件中輸出錯誤,但我也希望它們同時通過電子郵件發送。如果沒有一些技巧,這似乎是不可能的。
我發現了這個,但沒有幫助我。
最簡單的方法是什麼?
如果我正確理解您的問題,您希望將錯誤(而不是輸出)發送到日誌文件,並通過電子郵件發送。
為此,請結合使用
tee
和 stdout/stderr 重定向。根據cron(8)手冊頁,cron 可以為您處理電子郵件。無需不必要地重複這項工作。
執行命令時,任何輸出都會郵寄給 crontab 的所有者(或者發送給 crontab 中 MAILTO 環境變數中指定的使用者,如果存在的話)。
這裡的技巧是將 STDERR 發送到日誌文件和電子郵件,而不是 STDOUT。以下範例說明瞭如何執行此操作。
假設我的腳本執行以下命令。
ls tmp/foo
是成功的,所以這個輸出到 STDOUT。ls tmp/bar
產生一個錯誤,所以這個輸出被發送到 STDERR。$ ls tmp/foo tmp/bar ls: tmp/bar: No such file or directory tmp/foo
以下 cronjob 將隱藏任何 STDOUT,但會將 STDERR 重定向到 /var/log/test.log
* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log
這是結果。電子郵件和 ~/var/log/test.log 都會說同樣的話。
電子郵件正文說:
ls: tmp/bar: No such file or directory
日誌文件說同樣的話:
$ cat ~/var/log/test.log ls: tmp/bar: No such file or directory
作為額外的獎勵,還可以將 STDERR 和 STDOUT 發送到日誌文件(您只是偶爾查看),但將 STDERR 發送到螢幕(如果手動執行)或電子郵件(如果從 cron 執行)。我將以下程式碼段用於長時間執行的建構腳本。
{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE