VPS定时任务crontab完全指南:备份、更新和自动化脚本模板

备份脚本模板、系统更新自动化、日志清理和crontab排错调试方法
发布于
2

VPS上很多事不该手动做——每天备份数据库、每周更新系统、每月清理旧日志。crontab是Linux内置的定时任务调度器,几行配置就能让这些重复劳动自动跑。

crontab基础语法

编辑当前用户的定时任务:crontab -e。时间格式:分 时 日 月 星期 命令。

# 每行一个任务,格式:
# * * * * * /path/to/command
# │ │ │ │ │
# │ │ │ │ └─ 星期(0-7,0和7=周日)
# │ │ │ └─── 月份(1-12)
# │ │ └───── 日期(1-31)
# │ └─────── 小时(0-23)
# └───────── 分钟(0-59)

常用示例:

# 每天凌晨3点
0 3 * * * /script.sh

# 每30分钟
*/30 * * * * /script.sh

# 每周日凌晨2点
0 2 * * 0 /script.sh

# 每月1号凌晨4点
0 4 1 * * /script.sh

# 工作日每小时(周一到周五)
0 * * * 1-5 /script.sh

常用自动化脚本模板

数据库定时备份:

#!/bin/bash
# /root/scripts/backup_db.sh
BACKUP_DIR="/backup/db"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"

mysqldump -u root --all-databases | gzip > "$BACKUP_DIR/db_$(date +%Y%m%d).sql.gz"

# 删除7天前的旧备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# 可选:传到对象存储
coscmd upload "$BACKUP_DIR/db_$(date +%Y%m%d).sql.gz" /backup/
chmod +x /root/scripts/backup_db.sh
# 加到crontab:每天凌晨2点备份
0 2 * * * /root/scripts/backup_db.sh >> /var/log/backup.log 2>&1

系统自动更新:

#!/bin/bash
# /root/scripts/auto_update.sh
apt update && apt upgrade -y && apt autoremove -y
# 检查是否需要重启(内核更新了)
if [ -f /var/run/reboot-required ]; then
    echo "$(date): System reboot required" >> /var/log/update.log
    # 如果要在凌晨自动重启,取消下面注释:
    # reboot
fi
0 4 * * 0 /root/scripts/auto_update.sh >> /var/log/update.log 2>&1
# 每周日凌晨4点更新

日志清理:

# 清理nginx日志,保留30天
0 2 * * * find /var/log/nginx -name "*.log" -mtime +30 -delete

# 清理Docker日志(Docker容器日志会无限增长)
0 3 * * 0 echo "" > $(docker inspect --format='{{.LogPath}}' 容器名)

雨云入门VPS月付几块钱就能跑这些自动化任务——crontab不额外吃资源。优惠码 admin01 首月五折。

crontab排错和调试

定时任务运行了但没效果的最常见原因:

  1. PATH环境变量:cron运行的环境PATH只有/usr/bin:/bin。脚本里不要写mysql要写/usr/bin/mysql的完整路径。或者脚本开头加PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。
  2. 日志输出:脚本输出不会显示在终端,要重定向到文件——结尾加 >> /var/log/xxx.log 2>&1。2>&1把报错也写进去。
  3. 权限问题:cron以当前用户身份运行。root的crontab(sudo crontab -e)有root权限,普通用户crontab只有普通权限——备份/etc下的文件需要root。
  4. 百分比符号:crontab里%是特殊字符(表示换行),要转义写成%。

测试定时任务:设一个”每分钟执行”的测试——* * * * * echo “test at $(date)” >> /tmp/cron_test.log——过一分钟看/tmp/cron_test.log有没有内容。

vs systemd Timer

现代Linux推荐用systemd Timer替代crontab做定时任务——有更好的日志管理、依赖控制和随机延迟功能。但配置更复杂(需要写两个文件:.timer和.service)。简单定时任务crontab一行搞定,复杂任务推荐systemd Timer。

常见问题

crontab任务没执行怎么排查?

三个地方看:syslog里找CRON关键字(grep CRON /var/log/syslog);确认cron服务在跑(systemctl status cron);检查脚本是否有执行权限(chmod +x)。90%的问题出在PATH或权限。

定时任务可以互斥吗?上一次没跑完下一次别跑?

crontab不内置互斥。用flock加文件锁解决:flock -n /tmp/script.lock /script.sh——-n表示如果锁已被占用就直接退出。防止一个任务没跑完下一个又启动了导致N个实例同时跑。

crontab和其他定时方案选哪个?

简单的备份清理用crontab;复杂工作流(先备份→压缩→上传→通知)用脚本+crontab调用;需要精确调度和依赖管理的用systemd Timer;需要可视化管理多台VPS的用Jenkins/Rundeck。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

新开的VPS默认用root+密码登录、22端口全网开放,等于把门钥匙挂在门口。搞定这五个安全设置最多花半小时,把脚本小子和自动扫描器挡在外面。每一步都有命令,照做就行。 第一步:创建普通用户、禁用root直接登录 root是每台Linux都

按网上的教程配了SSH密钥、禁了密码登录,结果退出后连不上了——这种翻车事故每年都在重复上演。本文把SSH配置中的常见翻车点和恢复方法系统讲一遍。 翻车一:改了配置文件重启SSH后连不上 最经典的翻车:改了/etc/ssh/sshd_con