我的家庭服务器定期运行几个 shell 脚本来执行维护任务 - 主要是备份,但也有其他任务。我希望在出现任何故障时收到警报,但也希望记录其工作时间。
目前我的设置如下:
- Cron 调用一个 shell 脚本,该脚本又调用其他脚本(这样就不会变得太复杂)。我决定使用一个脚本来处理许多任务,而不是单独的 cron 项目,因为我不知道每个任务需要多长时间,而且我不希望它们相互干扰。
- 我的 cron 设置包含 MAILTO 行。我从来没有收到任何错误。
- 我没有任何日志记录。我只是时不时检查一下备份是否确实存在。
我知道,我可以在每个脚本中实现记录到文件(或系统日志)的功能。有没有一种方法可以从中心点定义它,这样我就不必将其单独编码到每个脚本中?
不知道如何实现更好的监控。我认为日志分析系统对此来说太过分了。有人建议通过 Jenkins 而不是 shell/cron 来运行脚本,但这似乎更加费力。
什么是简单而好的选择?
答案1
我已经实施了以下措施:
- 为各个步骤启用输出到标准输出或添加自定义输出,例如:
- echo “开始备份...”
- rsync 不管 && echo "备份成功" || echo "备份失败"
- 检查脚本每一步的返回码,要么立即退出子脚本,要么继续,在脚本末尾返回错误码
- 为我的维护脚本编写了一个包装器,它将所有输出重定向到日志文件,如果维护脚本中有任何错误,我会收到一封邮件。
维护脚本示例(如果任何单个步骤中断,则不会退出,但最终返回错误):
#!/bin/bash
RETURNCODE=0
echo "Execution started $(date)"
/root/do_something.sh || RETURNCODE=1
# (...)
exit $RETURNCODE
调用其他脚本的包装器脚本示例,该脚本现在位于我的 crontab 中:
#!/bin/bash
# exit on any error (there should not be any in this script)
set -e
LOGFILE="/var/log/my.log"
# redirect STDOUT and STDERR to logfile...
if /root/maintenance.sh > $LOGFILE 2>&1; then
# the colon ":" means: do nothing
:
else
# on error, send me an email
mail -s "maintenance script failed" [email protected] < "$LOGFILE"
fi