![是否有可用於 cron 作業的擴充日誌記錄?](https://rvso.com/image/52111/%E6%98%AF%E5%90%A6%E6%9C%89%E5%8F%AF%E7%94%A8%E6%96%BC%20cron%20%E4%BD%9C%E6%A5%AD%E7%9A%84%E6%93%B4%E5%85%85%E6%97%A5%E8%AA%8C%E8%A8%98%E9%8C%84%EF%BC%9F.png)
我在 下有 3 個腳本/etc/cron.daily
。我的 cron 日誌是用/var/log/cron
.下面是上面已運行的 cron 的條目。
(root) CMD (run-parts /etc/cron.hourly)
這裡cron 內的腳本的stdout
或不可用,它表明命令已在該資料夾上運行。stderr
run-parts
有什麼技巧可以幫助記錄執行 3 個腳本時發生的情況嗎?
注意:我無法編輯腳本cron.daily
以將輸出和錯誤重定向到日誌檔案。
答案1
在 Unix 上,郵件系統是將系統通知傳遞給使用者的方式。您可以將其視為有點像在 Windows 上,如果需要通知您某件事,工作列中會顯示一些內容並帶有彈出訊息。由於 cronjobs(理論上)不應該產生任何輸出(因為沒有人應該在那裡看到它),因此任何輸出(stdout 或 stderr)都被視為可能表明錯誤或問題,因此會向cronjob 的所有者提示他們檢查一下。
因此,所有輸出(stdout 和 stderr)都透過本機郵件系統發送給 cronjob 的擁有者。如果所有者是非個人帳戶,您可以透過設定別名指示本地 MTA 中繼到真實的電子郵件帳戶。例如,我添加到/etc/aliases
:
root: [email protected]
然後執行newaliases
命令(重建郵件別名資料庫)。之後,我開始在我的公司電子郵件收件匣中收到 root 的電子郵件:
root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
這或多或少是正常的方式(讓系統發送通知電子郵件)。還有其他處理通知的方法。一些替代方案:
修改別名以將電子郵件儲存到特定檔案:
root: /var/log/rootMails
將郵件透過管道傳輸到腳本:
root: |/usr/local/bin/filterMail
解決別名問題的另一種方法是使用MAILTO=
許多 cron 守護程式支援的使用者 crontab 中的選項。如果您只想接收一組特定的使用者通知,而不是任何將放入其郵箱的內容(這就是aliases
實現的效果),那麼這可能是更好的選擇。
我確信還有很多其他的,但您可能想做第一個或最後一個。
答案2
您可以執行 cron 並-s
選擇使用 syslog 而不是發送郵件。這至少適用於 RHEL 及其衍生產品、FreeBSD 和 MacOS。
答案3
您可以將自己記錄在 bash 腳本中:
logfile=/var/log/mine/whatever.log
log () {
timestamp=$(date +'%F %T')
echo -e "$timestamp $1" >> $logfile
shift
for a; do
echo -ne "$a" >> $logfile
done
}
log "Hello world.\nAnd so on..."
[...]
如果您正在執行的命令包含要記錄的輸出:
somecommand 2>&1 >> $logfile
您也可以將訊息和錯誤傳送到系統記錄器(請參閱 參考資料man logger
),並可能透過 syslog 配置對它們進行排序。