Cron执行certbot续期脚本时意外发送两封邮件问题咨询
问题原因
- 你写的管道命令默认只处理
certbot命令的标准输出(stdout),而certbot输出的Saving debug log...、Cert not yet due for renewal这类信息是打印到标准错误(stderr)的,这部分内容没有被后续的gpg、mail管道捕获。 - 如果你是把这个脚本放在crontab中定时执行,cron默认会将定时任务所有未被重定向的输出内容,以邮件形式发送给任务的执行用户(默认是root,对应邮箱就是root@domain.local这类本地域名邮箱),这就是你看到滞留邮件的来源。
修复方案
把脚本中certbot的stderr也合并到stdout中,让所有输出都进入后续管道处理即可,修改后的命令如下:
/usr/bin/certbot renew --apache 2>&1 | gpg -u root -e -s -a -z 9 -r my@email.com | mail -s "Letsencrypt Autorenew" my@email.com
补充说明
- 末尾加的
2>&1是shell重定向语法,意思是把文件描述符2(stderr)的内容重定向到文件描述符1(stdout)对应的输出流里,这样certbot所有打印内容都会被管道捕获,不会有残留输出被cron捕获发本地邮件。 - 如果你不需要保留certbot的这些提示信息,也可以直接把stderr丢弃,写法是在certbot命令末尾加
2>/dev/null,不过更推荐上面合并输出的方式,方便后续排查证书更新失败的问题。
内容的提问来源于stack exchange,提问作者adiDX
相关产品推荐
相关产品推荐

