Linux crontab 定时任务详解:cron 表达式、常用命令与自动化脚本,让服务器自己干活


服务器上很多事需要定时做:每天备份数据库、凌晨清理日志、定期检查磁盘空间、早上给网站发个测试邮件……手动做太累也容易忘。Linux 的 crontab 就是干这个的:按设定好的时间,自动执行脚本或命令,一天 24 小时无人值守也能按时"打卡上班"。这篇文章把 crontab 的语法、常用命令和几个实战案例讲清楚。

一、crontab 是做什么的

crontab 是 Linux 内置的定时任务工具,由后台守护进程 crond 统一调度。你只需写一行"在什么时间,执行什么命令",它就会到点自动跑。装系统一般自带,先确认服务在跑:

systemctl status crond      # CentOS 用 crond
# 或
systemctl status cron        # Ubuntu/Debian 用 cron

若没启动:

systemctl start cron && systemctl enable cron

二、crontab 常用命令

crontab -l          # 查看当前用户的定时任务
crontab -e          # 编辑定时任务(默认 vi)
crontab -r          # 删除所有定时任务
crontab -u 用户名 -l # 查看指定用户的任务(需 root)

第一次用 crontab -e 会提示选择编辑器,选 1(nano)或 3(vim)都行。-e 打开后,每行一个任务,格式如下。

三、crontab 语法详解

一行任务的基本格式是五段"时间" + 一条命令:

分 时 日 月 周   要执行的命令
字段 范围 说明
分 0-59 第几分钟执行
时 0-23 第几小时执行
日 1-31 每月的第几天
月 1-12 每年的第几月
周 0-7 星期几(0 和 7 都指周日)

每个字段的取值规则:

  • * :每个时间单位都执行(每分钟/每小时…)
  • , :列举多个,如 1,15,30 表示第 1、15、30 分
  • - :范围,如 9-18 表示 9 点到 18 点
  • / :间隔,如 */5 表示每 5 个单位

记住一句话:分 时 日 月 周,从分钟开始写。

四、常用时间写法速查

*/5 * * * *   命令        # 每 5 分钟
0 * * * *     命令        # 每小时整点
0 3 * * *     命令        # 每天凌晨 3 点
30 2 * * 1    命令        # 每星期一凌晨 2:30
0 9 1 * *     命令        # 每月 1 号上午 9 点
0 0 1 1 *     命令        # 每年 1 月 1 日 0 点(新年任务)

写错最常犯的是"每 5 分钟"写成 5 * * * *(那是第 5 分钟执行一次)。每 N 时间要用 */N。

五、实战案例

1. 每天凌晨 3 点备份 MySQL 数据库:

先写一个备份脚本 /root/backup_db.sh:

#!/bin/bash
mkdir -p /backup/mysql
mysqldump -u root -p'你的密码' --all-databases > /backup/mysql/db_$(date +%Y%m%d).sql
find /backup/mysql -name "*.sql" -mtime +7 -delete   # 只保留最近 7 天

加执行权限并写进 crontab:

chmod +x /root/backup_db.sh
crontab -e
# 加入一行:
0 3 * * * /root/backup_db.sh >> /var/log/backup.log 2>&1

>> 文件 2>&1 把输出和报错都记到日志,方便排查。

2. 每天清理日志文件:

0 0 * * * find /var/log -name "*.log" -mtime +30 -delete

3. 定期检查磁盘并告警:

0 20 * * * df -h / | awk 'NR>1 && int($5)>80 {echo "磁盘将满"; }'

(更专业的磁盘检查和清理可配合本站磁盘清理、日志切割教程。)

4. 定时给接口做健康检查 / 发测试邮件:

*/10 * * * * curl -s -o /dev/null -w "%{http_code}" http://localhost/ | grep -q 200 || echo "站点挂了"

六、crontab 的常见坑

坑 1:脚本里引用了系统全局变量/路径找不到

crontab 运行环境很"干净",没有你 shell 里那些 PATH。脚本开头尽量写绝对路径,并在脚本内设置:

#!/bin/bash
source /etc/profile

命令也用全路径,如 /usr/bin/mysqldump。

坑 2:脚本不执行?先手动试 + 看日志

先手动执行一遍脚本确认能成功,再看 cron 日志:

cat /var/log/cron          # CentOS / Ubuntu 的 cron 日志位置可能不同
# 或
grep CRON /var/log/syslog  # Debian 系

还要确认 crontab 里写的是绝对路径、有执行权限。

坑 3:权限问题

crontab -e 编辑的是当前用户的任务,备份、清日志这类需要 root 权限的操作,要用 root 用户(sudo crontab -e)设置。

坑 4:命令带特殊字符 / % 号

cron 里 % 会被当成换行,命令里若有 %(如 date +%Y)要转义成 \%,或者干脆写进脚本文件再执行,更省心。

七、校验要执行的脚本

crontab 只负责到点触发,不会帮你检查脚本对不对。任何任务上线前,先在命令行手动跑一遍脚本,确认无报错、产物正确,再交给 cron,否则到点执行的是"坏"命令。

八、配合其他工具使用

  • 定时备份 + 本站的 rsync 同步异机,双保险
  • 日志清理 + 本站的 Nginx 日志切割 / logrotate,磁盘永不满
  • 复杂编排可用 Systemd Timer 替代 crontab,功能更严格、可管理性更好(参考本站 systemctl 教程)

总结

crontab 让你把"定时重复的事"一次性写进服务器,之后它自己到点干活。核心掌握:五段时间格式 分 时 日 月 周、*/N 表示每 N 个、脚本用绝对路径、上线前手动验证。抓住这几点,备份、清理、监控全都能自动化,运维省一大半心。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Nginx 配置 HTTPS 免费证书教程:Let's Encrypt 签名、自动续期一步到位,让网站变 https 小绿锁

Nginx 反向代理配置详解:一台服务器搭多个网站、给应用加域名,反向代理全搞懂

评 论
更换验证码