如果输出大于 100 个字符,Cron tab 会向我发送邮件吗?

如果输出大于 100 个字符,Cron tab 会向我发送邮件吗?

如果 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 } }'

相关内容