如何用 crontab 定时脚本让已部署的 reference 站点同步更新最新内容?

发布时间:2026/9/15 15:30:06
如何用 crontab 定时脚本让已部署的 reference 站点同步更新最新内容? 如何用 crontab 定时脚本让已部署的 reference 站点同步更新最新内容【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/referencereference 是一份开发者技术速查清单Cheat Sheets站点上游仓库通过 GitHub Actions 自动发布到gh-pages分支。如果你已经把站点的gh-pages分支克隆到自己的 Linux 服务器并用 nginx 等静态服务对外提供访问内容就会停留在克隆那一刻——上游更新后本地站点不会自己变。项目贡献文档CONTRIBUTING.md给出了一条官方支持的同步路径在服务器上放置一个git-down-pages.sh脚本用 crontab 定时执行脚本先比较线上gh-pages分支的 commit 与本地 commit不一致才备份旧版本并重新克隆最新代码。本文按这条路径走一遍放置脚本、配置定时任务、配置 nginx 指向、验证同步结果。前提一台 Linux 服务器已安装git和 crontabcron静态服务用 nginx 示例站点目录约定在/data/reference同步脚本放在/opt/cron/。部署结构与文件位置整条路径涉及三个位置动手前先确认它们与你服务器上已部署的目录一致不一致就按你的实际路径替换位置用途/data/reference站点静态文件目录nginx 的root指向这里/opt/cron/git-down-pages.sh同步脚本/opt/cron/git-down.logcrontab 执行脚本的输出日志脚本的备份逻辑依赖相对路径../reference它会先cd /data再cd reference然后把../reference即/data/reference改名为/data/reference_backup_时间戳。所以站点目录必须和脚本中DATA_DIR/data保持对应。创建同步脚本 git-down-pages.sh在 Linux 服务器上创建git-down-pages.sh并放置在/opt/cron/目录下。下面是 CONTRIBUTING.md 中给出的完整脚本源码#!/bin/bash PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH #author: 南宫乘风 DATA_DIR/data REPO_URLhttps://gitee.com/jaywcjlove/reference.git BRANCHgh-pages MAX_BACKUPS3 # 函数备份旧版本 backup_old_version() { echo 备份旧版本... mv ../reference ../reference_backup_$(date %Y%m%d%H%M%S) if [ $? -eq 0 ]; then echo 备份完成。 remove_old_backups else echo 备份时出现错误。 exit 1 fi } # 函数删除多余备份保留最近的三个 remove_old_backups() { echo 删除多余备份保留最近的三个... ls -1d ../reference_backup_* | head -n -${MAX_BACKUPS} | xargs -r rm -r } # 函数拉取最新代码 clone_latest_code() { echo 拉取最新代码... # 进入 /data 目录 cd $DATA_DIR git clone $REPO_URL -b $BRANCH if [ $? -eq 0 ]; then echo 拉取最新代码完成。 else echo 拉取最新代码时出现错误。 exit 1 fi } # 检查是否存在 DATA_DIR 目录不存在则创建 if [ ! -d $DATA_DIR ]; then echo 目录 $DATA_DIR 不存在创建中... mkdir -p $DATA_DIR if [ $? -eq 0 ]; then echo 目录创建成功。 else echo 目录创建失败。 exit 1 fi fi # 进入 /data 目录 cd $DATA_DIR # 检查是否存在 reference 目录 if [ -d reference ]; then # 进入 reference 目录 cd reference # 获取远程和本地的 commit 哈希值 REMOTE_COMMIT$(git ls-remote $REPO_URL $BRANCH | cut -f1) LOCAL_COMMIT$(git rev-parse HEAD) # 比较远程和本地的 commit if [ $REMOTE_COMMIT $LOCAL_COMMIT ]; then echo 本地 reference 目录已经是最新版本无需拉取。 else echo 本地 reference 目录不是最新版本开始拉取最新代码... backup_old_version clone_latest_code fi else # 如果目录不存在直接克隆 clone_latest_code fi echo ---------------------------------------------------------------------------- endDatedate %Y-%m-%d %H:%M:%S echo ★[$endDate] Successful echo ----------------------------------------------------------------------------脚本里有几个关键变量按文档原样理解即可DATA_DIR/data站点父目录克隆出的目录即/data/referenceREPO_URL文档给出的克隆地址是 Gitee 镜像仓库文档说明中提到国内访问 GitHub 时常打不开才推荐镜像部署如果你自己的网络环境可以直接访问 GitHub可以换成 GitHub 上的gh-pages仓库地址首次手动部署时用的命令就是git clone https://github.com/jaywcjlove/reference.git -b gh-pagesBRANCHgh-pages固定同步上游发布的静态页分支MAX_BACKUPS3最多保留最近 3 份备份。执行前必须了解脚本的副作用当检测到远程 commit 与本地不一致时脚本会执行两步有破坏性的操作——先用mv把当前在线目录/data/reference整体改名成/data/reference_backup_时间戳改名到重新克隆完成之间指向/data/reference的站点会短暂不可访问然后对超过 3 份的旧备份执行xargs -r rm -r删除。因此运行该脚本的账号需要对/data有读写权限通常用 root并且你要接受备份只保留最近 3 份这一限制。另外crontab 直接按路径执行脚本所以git-down-pages.sh需要可执行权限文档未给出具体命令按 Linux 常规做法执行chmod x /opt/cron/git-down-pages.sh。配置 crontab 定时任务用crontab -e编辑不存在时会创建crontab 文件加入定时任务。文档给出的示例是每十分钟同步一次线上的pages内容crontab -e */10 * * * * /opt/cron/git-down-pages.sh /opt/cron/git-down.log 21crontab 的五段格式为分 时 日 月 周详见 docs/cron.md*/10 * * * *表示每 10 分钟触发一次文档说明时间可以根据自己需求设定比如改为每小时、每天都可以。 /opt/cron/git-down.log 21把脚本的标准输出和错误输出都追加到日志文件这是后面验证同步是否执行的依据。配置 nginx 指向更新目录同步脚本只负责把最新静态文件放到/data/referencenginx 必须把站点指到同一个目录定时更新才对外生效。文档给出的配置片段listen 80; listen 443 ssl http2; server_name xxx.xxx.top; #配置你的域名 index index.php index.html index.htm default.php default.htm default.html; root /data/reference; # 文件存放的位置其中server_name xxx.xxx.top;处的域名需要替换成你自己的域名root /data/reference;必须与脚本克隆出的目录一致。改完 nginx 配置后按你的环境常规操作重新加载 nginx 使配置生效文档未展开这一步。验证同步是否生效按下面顺序核对每一步都有文档对应的判断依据确认定时任务已写入执行crontab -ldocs/cron.md 中说明该命令显示 crontab 文件能看到*/10 * * * * /opt/cron/git-down-pages.sh ...这一行。先手动跑一次脚本观察它自己的输出直接执行/opt/cron/git-down-pages.sh。脚本内部通过git ls-remote $REPO_URL $BRANCH | cut -f1取远程gh-pages的最新 commit再用git rev-parse HEAD取本地 commit二者比较一致时输出本地 reference 目录已经是最新版本无需拉取。不一致时输出本地 reference 目录不是最新版本开始拉取最新代码...随后依次输出备份旧版本...、拉取最新代码...。无论哪种分支每次运行结束都会输出一行带时间戳的★[时间] Successful。如果目录不存在脚本会先创建/data并直接克隆克隆失败时输出拉取最新代码时出现错误。并以exit 1退出。等待定时触发后检查日志cat /opt/cron/git-down.log或tail -f。如果 crontab 生效且脚本正常日志里应出现上述状态行和★[...] Successful如果上游没有新提交看到的应是已经是最新版本无需拉取。日志里出现备份时出现错误或拉取最新代码时出现错误说明mv或git clone失败检查/data目录权限和到REPO_URL的网络连通性。确认站点内容确实更新了在/data/reference目录执行git rev-parse HEAD与远程最新 commit 对比脚本内部用的就是这两个值。本地目录已经是最新 commit、且 nginxroot指向/data/reference浏览器里看到的就是最新内容。限制与可选替代路径每次更新采用改名旧目录 重新git clone的方式更新瞬间站点会短暂不可用备份只保留最近 3 份更早的旧版本会被脚本删除。脚本比较的是gh-pages分支的 commit只有上游 Actions 发布成功、gh-pages分支前进后下一次定时运行才会真正拉取新内容本地已是最新时脚本只输出提示、不做任何改动。如果你的站点放在支持 GitHub Actions 的仓库里CONTRIBUTING.md 还给出了另一条自动更新路径在仓库添加.github/workflows/update-ref.yml用schedule: cron: 21 */8 * * *每 8 小时拉取main分支、写入.env后npm run build再用 SFTP 部署到服务器。该方案走 CI 编译而非同步gh-pages分支和本文的 crontab 脚本是两条独立路径按需二选一即可。【免费下载链接】reference面向开发者的技术速查清单Cheat Sheets集合整理常见技术、工具与开发流程帮助快速查阅关键信息提高开发效率。项目地址: https://gitcode.com/GitHub_Trending/referen/reference创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考