定时重启维护脚本自动更新站点程序
很多站点程序(如 WordPress、Typecho、自建 CMS)都需要定期更新来修复漏洞或获得新功能,但每次都手动登录后台点更新非常麻烦。
如果能写一个自动更新脚本,配合定时重启任务,就能实现无人值守的日常维护。
本文从零开始,带你走通整个流程。
理解你的站点结构
先确认你的站点程序安装在哪个目录,更新方式是什么。
常见两种情况:
- 程序自带命令行更新工具(如 WordPress 的 wp-cli)
- 程序通过 Git 拉取最新代码,然后执行迁移或编译
如果你用的是宝塔面板,路径通常在 /www/wwwroot/你的域名。
如果你用裸机 LAMP 或 LNMP,位置可能是 /var/www/html 或其他自定义路径。
准备环境:确认 cron 和脚本权限
所有 Linux 服务器默认都带有 cron 定时任务服务。
检查它是否在运行:
systemctl status crond
如果没启动,执行:
systemctl start crond
systemctl enable crond
同时确认你能用 sh 命令执行脚本。
一般不需要额外安装组件。
编写自动更新与重启脚本
假设你的站点位于 /var/www/mysite,并且支持通过 git pull 更新代码,然后需要重启 Nginx 或 Apache 来加载新文件。
创建一个脚本文件:
#!/bin/bash
# 自动更新站点程序并重启服务
SITE_DIR="/var/www/mysite"
LOG_FILE="/var/log/auto_update.log"
echo "$(date) 开始自动更新" >> $LOG_FILE
# 进入站点目录
cd $SITE_DIR
# 拉取最新代码
git pull origin main >> $LOG_FILE 2>&1
# 如果站点需要 composer 或 npm 构建,可在这里加入
# composer install --no-dev
# npm run build
# 重启 Web 服务(以 Nginx 为例)
systemctl restart nginx
echo "$(date) 更新完成,服务已重启" >> $LOG_FILE
如果你用的站点程序自带更新命令,例如 WordPress 的 wp-cli:
wp core update
wp plugin update --all
注意将脚本赋予执行权限:
chmod +x /usr/local/bin/auto_site_update.sh
设置定时任务实现自动触发
用 crontab -e 编辑当前用户的定时任务。
为避免权限问题,建议用 root 用户执行。
添加一行:
# 每天凌晨 3 点执行一次
0 3 * * * /usr/local/bin/auto_site_update.sh
保存后,可以用 crontab -l 确认任务已生效。
如果你的程序要求更新时网站暂停访问,可以写成:先进入维护模式、更新、退出维护模式。
这里不再展开。
避坑指南:容易踩的 4 个坑
- 路径不对:脚本里的绝对路径一定要和实际站点位置一致,否则 git pull 会失败。
- 权限不足:cron 默认以当前用户身份运行,可能没写权限。建议用 root 的 crontab,或给站点目录设置合适权限。
- 忽略依赖安装:如果你的程序更新后需要执行 composer install 或 npm install,一定要在脚本里显式写上。
- 冲突合并:如果站点的代码有本地修改,git pull 会提示冲突导致中断。建议同时执行
git stash或定时使用git fetch --all && git reset --hard origin/main。
验证自动更新是否正常
设置完成后,第二天检查日志文件:
cat /var/log/auto_update.log
同时手动查看站点是否能正常访问,以及程序版本是否已更新。
你也可以立即运行一次脚本测试:
bash /usr/local/bin/auto_site_update.sh
观察有无报错。
如果一切正常,你的站点就会每天凌晨自动完成更新并重启服务了。
高频问题解答
Q:站点更新后是否需要重启 Nginx 或 Apache?
A:如果仅更新 PHP 文件,通常不需要重启,但为了保险(比如更新了配置或 opcache 缓存),建议重启。如果更新包含 .htaccess 或静态文件,重启更稳。
Q:我用的是宝塔面板,怎么设置?
A:宝塔面板的“计划任务”功能就是 cron 的图形版。添加一个 Shell 脚本类型的任务,粘贴上面脚本内容,设置时间,保存即可。
Q:不想用 git,还能自动更新吗?
A:可以。如果你的程序支持下载压缩包解压,用 wget 和 unzip 命令也能实现。但维护起来不如 git 方便。
Q:脚本里如何判断更新成功?
A:通过 $? 检查上一条命令执行状态,在日志里记录成功或失败。例如:if [ $? -eq 0 ]; then echo "success"; else echo "failed"; fi。
如果你在配置中遇到脚本执行无反馈的情况,可以先从手动执行开始排除。
建议先在测试环境跑一遍,再布到生产站点。