Linux

使用 MAILTO 記錄所有 crontab 輸出

  • May 10, 2019

我一直在嘗試將所有 cron 作業輸出到一個文件(不是電子郵件)。別名在 /etc/aliases 中設置。

logthecron: "|cronlog.sh"

在 crontab 中MAILTO=logthecron。cronlog.sh 文件寫入輸出到某個文件:

#!/bin/sh
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/" >> /tmp/a

我正在使用發送郵件。Sendmail 使用 smrsh,這是一個受限的 shell 實用程序,它提供了通過 /etc/smrsh 目錄指定可用於 Sendmail 的可執行程序的顯式列表的能力。所以我將 cronlog.sh 和 sendmail 符號連結到該目錄。就像是…

ln -s /root/cron/cronlog.sh /etc/smrsh/

並且仍然不斷收到此錯誤。

May 10 09:33:11 sandbox01 smrsh: uid 8: attempt to use "cronlog.sh"
May 10 09:33:11 sandbox01 sendmail[23870]: x4ADXB5Y023868: to="|cronlog.sh", ctladdr=<logthecron@[hostname]> (8/0), delay=00:00:00, xdelay=00:00:00, mailer=prog, pri=30787, dsn=5.0.0, stat=Service unavailable
May 10 09:33:11 sandbox01 sendmail[23870]: x4ADXB5Y023868: x4ADXB5Y023870: DSN: Service unavailable

注意:我使用的是 CentOS v7,該文件是可執行的,電子郵件工作沒有問題,嘗試了別名中的整個目錄路徑,我不想編寫單個 cronjob 輸出,而是將 cron 作業的所有輸出寫入某個文件。

參考:

  1. smrsh: http: //www.faqs.org/docs/securing/chap22sec182.html
  2. 將 crontab 的所有 stderr 輸出記錄到文件中

而不是嘗試使用MAILTO(將始終被解釋為電子郵件地址),使用SHELL.

設置SHELL為執行給定命令並將輸出定向到文件的小型可執行 shell 腳本的路徑:

#!/bin/sh

now=$(date)
/bin/sh "$@" 2>&1 | awk -v now="$now" '{ printf("[%s]\t%s\n", now, $0) }' >/tmp/cronjob.log

此處將"$@"擴展為-c後跟 crontab 文件中的作業規範。"$@"用雙引號書寫很重要。

在 crontab 中,使用

SHELL=/path/to/cronrun

# rest of crontab below...

(假設/path/to/cronrun是該短腳本的正確路徑)

引用自:https://unix.stackexchange.com/questions/518243