如果 cron tab 的输出大于 100 个字符,我想从它获取邮件。
为了接收邮件,我安装了 postfix。但我想知道上述情况是否可行?如果可行,脚本应该如何编写?
例子:
MAILTO:[email protected]
5 07 * * * /usr/local/bin/curator --dry-run --config /home/itadmin/.curator/curator.yml /home/itadmin/.curator/snapshot.yml 2>&1 | /usr/bin/tee -a /home/itadmin/.curator/logs.txt
通过这种方式,我可以收到上述 cron 作业产生的每个输出的电子邮件,但我只想在 crontab 输出大于 100 个字符时发送邮件。
谢谢
答案1
Cron 的内部邮件功能非常有限:它要么发送命令的输出,要么不发送,其中的标题是硬编码的do_command.c
:
358 /* if we are supposed to be mailing, MAILTO will
359 * be non-NULL. only in this case should we set
360 * up the mail command and subjects and stuff...
361 */
362
363 if (mailto) {
375 fprintf(mail, "From: root (Cron Daemon)\n");
376 fprintf(mail, "To: %s\n", mailto);
377 fprintf(mail, "Subject: Cron <%s@%s> %s\n",
378 usernm, first_word(hostname, "."),
379 e->cmd);
如果您需要更多内容,您应该将输出保存到文件中并调用另一个命令来评估其内容,并在满足所需条件时邮寄。
答案2
使用 awk 计算标准输出上的字符数。保存行,直到写入的字符数超过 100 个。打印保存的行,然后继续打印,直到输出结束:
/usr/local/bin/curator --dry-run --config /home/itadmin/.curator/curator.yml /home/itadmin/.curator/snapshot.yml 2>&1 | awk '{ if ( morethan100 == 1 ) { print $0 ; next } } { count += length } { a[NR]=$0 } { if (count > 100) { for (i=1 ; i <= NR ; i++) { print a[i] } morethan100=1 } }'
当您的命令产生少于 100 个字符时,这将不会产生任何输出(也不会产生邮件);否则,当您的命令超过 100 个字符时,它将输出所有内容(并发送邮件)。
如果要将换行符算作字符,则需要为每一行加 1:
/usr/local/bin/curator --dry-run --config /home/itadmin/.curator/curator.yml /home/itadmin/.curator/snapshot.yml 2>&1 | awk '{ if ( morethan100 == 1 ) { print $0 ; next } } { count += length + 1 } { a[NR]=$0 } { if (count > 100) { for (i=1 ; i <= NR ; i++) { print a[i] } ; morethan100=1 } }'