Cron 定时任务实战:让 Linux 服务器自己干活
每天凌晨 2 点自动备份网站数据、每周清理一次过期日志、每 5 分钟检查一次服务状态——这些重复性的运维工作,完全可以交给 cron。本文从零开始,带你掌握 Linux 定时任务的实战用法。
一、cron 是什么
cron 是 Linux 自带的定时任务服务,由守护进程 crond 常驻后台,每分钟检查一次是否有任务需要执行。用户通过 crontab 命令管理自己的定时任务表。
先确认服务在运行:
systemctl status crond
未运行的话,用下面命令启动并设为开机自启:
systemctl enable --now crond
二、读懂时间表达式
crontab 每行由 6 部分组成,前 5 个是时间字段,最后是命令:
* * * * * command
分 时 日 月 周
| 字段 | 取值范围 |
|---|---|
| 分 | 0-59 |
| 时 | 0-23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 周 | 0-7(0 和 7 都表示周日) |
常用符号:
*:表示“每”,即该字段的每个取值,:枚举,如1,15表示 1 号和 15 号-:范围,如9-17表示 9 点到 17 点/:步长,如*/5表示每 5 个单位执行一次
几个常见写法:
*/5 * * * * /opt/check.sh # 每 5 分钟执行一次
0 2 * * * /opt/backup.sh # 每天凌晨 2 点执行
0 9 * * 1 /opt/weekly.sh # 每周一上午 9 点执行
30 3 1 * * /opt/monthly.sh # 每月 1 号凌晨 3:30 执行
三、常用操作
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
crontab -r # 删除当前用户所有定时任务(慎用)
crontab -e 默认用 vi 打开编辑器,不习惯的话可以先执行 export EDITOR=vim。
除了用户级任务,还有系统级任务:/etc/crontab 和 /etc/cron.d/ 目录下的规则会多一个“以哪个用户执行”的字段:
0 2 * * * root /opt/backup.sh
另外 /etc/cron.daily/、/etc/cron.hourly/ 等目录里的可执行脚本也会被定时执行,适合放简单的日常脚本。
四、实战:网站自动备份
先写一个备份脚本 /opt/backup.sh:
#!/bin/bash
DATE=$(date +%Y%m%d)
tar -czf /backup/www-$DATE.tar.gz /var/www/html
find /backup -name "www-*.tar.gz" -mtime +7 -delete
再加一条定时规则,每天凌晨 2 点执行:
0 2 * * * /bin/bash /opt/backup.sh >> /var/log/backup.log 2>&1
这条规则做了三件事:打包网站目录并用日期命名、删除 7 天前的旧备份、把输出追加到日志文件方便排查。
五、避坑指南
- 环境变量缺失:cron 执行时的 PATH 很短,脚本里尽量使用命令的绝对路径,或在 crontab 开头声明:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin。 - 输出重定向:命令的输出默认会发邮件给任务属主,建议统一追加到日志:
>> /var/log/xxx.log 2>&1。 - 任务重叠:如果任务执行时间可能超过执行间隔,用 flock 加锁避免并发:
*/5 * * * * /usr/bin/flock -n /tmp/check.lock /opt/check.sh。 - 注意时区:云服务器上先用
timedatectl确认系统时区是否符合预期。 - 权限别忘:脚本要有可执行权限,
chmod +x /opt/backup.sh别忘了。
六、任务没跑起来怎么查
systemctl status crond # 服务是否在运行
crontab -l # 规则是否真的保存成功
grep CRON /var/log/cron # 系统日志里有没有执行记录
最常见的情况是“脚本手动能跑,放进 cron 就不跑”,九成是环境变量或相对路径的问题。把脚本放到 cron 的最小环境里单独跑一遍,基本都能定位。
结语
cron 看似简单,但把“时间表达式 + 可靠脚本 + 日志记录”这三件套用好,就能接管大部分重复性运维工作。从每天自动备份开始,让服务器在你睡觉的时候替你干活吧。
- 点赞
- 收藏
- 关注作者
评论(0)