我一直在尝试将所有 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
不要尝试使用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
是该短脚本的正确路径)