0%

Crontab加入Git版本控制

将 Crontab 计划任务加入到 Git 版本控制。通过 Git 来控制 Crontab 计划任务的自动启停。

为什么

  • 将 crontab 放到 Git 后有哪些优点?
    • 可以避免线上服务器突然崩溃,crontab 无法找回。
  • crontab 自动更新计划任务
    • 在新增 crontab 任务时,可自动部署,使计划任务即时生效。
    • 弥补仅使用 Git 做备份的不足,增加计划任务入口单一,避免遗忘。
    • 使计划任务可在指定服务器或多台服务器上执行。
  • 不足? 仍然需要先在服务器上运行下计划任务脚本,在保证正常执行后,再将其添加至 crontab 文件。

项目部署流程

  1. 在项目的根目录下创建 crontab 文件。

  2. crontab 文件中,编写 crontab 命令。

  3. crontab 文件,通过 git push 提交。

  4. Git webhook 自动触发 jenkins 构建完成代码上传。

  5. 在每台服务器上执行以下命令。

    1
    2
    3
    4
    grep "PROJECT_PATH" /etc/environment || \
    echo "export PROJECT_PATH=`grep -E '\broot\b' /data/nginx/conf/nginx.conf | head -n 1 | awk '{print $2}' | grep -Eo '\/data\/htdocs\/[[:alpha:]]*'`" >> /etc/environment && \
    source /etc/environment; \
    crontab $PROJECT_PATH/crontab

Crontab 文件内容示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 注意:为避免新增、更新计划任务异常,导致后续计划任务无法正常运行。请在新增、更新计划任务时,在本文件末尾处追加。
########################### 公共计划任务 S ################################
# 系统时间
* */1 * * * /sbin/ntpdate pool.ntp.org > /dev/null 2>&1
# 自动检测 crontab
* * * * * [ `stat -c \%Y $PROJECT_PATH/crontab` -gt `stat -c \%Y /var/spool/cron/root` ] && crontab $PROJECT_PATH/crontab && echo "Crontab auto-update at $(date '+\%Y-\%m-\%d \%H:\%M:\%S')" >> /tmp/crontab-auto-update.log
########################### 公共计划任务 E ################################

########################### 51.96 计划任务 S ################################
* * * * * [ `hostname -s` = "web96" ] && /usr/bin/php $PROJECT_PATH/public/cli.php request_uri="/test/updateUser" > /dev/null 2>&1
0 */8 * * * [ `hostname -s` = "web96" ] && flock -xn /tmp/updateUserName.lock /usr/bin/php $PROJECT_PATH/public/cli.php request_uri="/test/updateUserName" > /dev/null 2>&1
# test crontab
#* * * * * echo "系统当前时间:$(date) " >> /tmp/crontab-test.log
########################### 51.96 计划任务 E ################################
  • 公共计划任务可根据此处复制粘贴,也可追加计划任务,比如:nginx 的 log 文件处理脚本等。
  • 下面的 51.96 计划任务 是为了只在 51.96 服务器上执行计划任务,若不加 [ ``hostname -s`` = "web96" ] && 代码,则将在所有生效的服务器上执行计划任务。项目都会有多台 web 服务器,而计划任务通常只需要在其中一台上执行。若不知项目要部署到那台服务器上,可在服务器上执行 hostname -s,将结果值替换示例中的 web96
  • 环境变量 $PROJECT_PATH 是项目的根目录路径。

Gist for github

https://gist.github.com/codezm/4e0266d30891bd7de076442a797a1e0a