如何监控cron维护脚本?

如何监控cron维护脚本?

我的家庭服务器定期运行几个 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

相关内容