Linux Crontab 定时任务完全指南:让服务器按时干活

Crontab 是什么

Crontab 是 Linux 自带的定时任务管理工具。你告诉它”在什么时间执行什么命令”,它就会按计划自动执行。不用人工盯着,不用写复杂的脚本调度器。

常见的使用场景:

  • 每天凌晨 3 点备份数据库
  • 每隔 5 分钟检查服务是否存活
  • 每周一早上 8 点清理日志文件
  • 每月 1 号生成上月报表

Cron 表达式速查

Cron 表达式由 5 个字段组成,用空格分隔:

* * * * * 命令
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7, 0和7都是周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)

常见写法示例:

0 3 * * *           # 每天凌晨 3:00
30 8 * * 1-5        # 工作日 8:30
0 */6 * * *         # 每 6 小时
*/15 * * * *        # 每 15 分钟
0 0 1 * *           # 每月 1 号 0:00
0 9 1,15 * *        # 每月 1 号和 15 号 9:00
0 0 * * 0           # 每周日 0:00

基本操作

查看当前用户的定时任务

crontab -l
使用 crontab -l 查看定时任务
使用 crontab -l 查看当前用户的所有定时任务

如果还没有任何定时任务,会提示 no crontab for username

编辑定时任务

crontab -e
使用 crontab -e 编辑定时任务
使用 crontab -e 进入编辑模式配置定时任务

第一次执行会让你选择编辑器,推荐选 vim.basicnano(对新手更友好)。

编辑后保存退出,crontab 会自动安装新配置。可以用 crontab -l 确认是否生效。

删除所有定时任务

crontab -r

⚠️ 这个操作不可逆,会删除所有定时任务! 如果不确定,先 crontab -l > /tmp/crontab_backup 备份一下。

以 root 身份管理其他用户的定时任务

crontab -u username -l    # 查看
crontab -u username -e    # 编辑

写定时任务的注意事项

用绝对路径

Cron 执行时的环境变量和你手动执行时不一样。特别是 PATH,Cron 默认的 PATH 很短,可能找不到你常用的命令。

# ❌ 错误写法
0 3 * * * python3 /opt/backup.py

# ✅ 正确写法
0 3 * * * /usr/bin/python3 /opt/backup.py

如果你不确定命令的完整路径,用 which 命令名 查一下。

重定向输出

Cron 执行时的输出默认会发邮件给系统用户。如果你不需要这些邮件,记得重定向:

# 丢弃所有输出
0 3 * * * /opt/backup.sh > /dev/null 2>&1

# 保存日志
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

设置环境变量

如果你的脚本依赖特定的环境变量,可以在 crontab 文件开头设置:

SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
JAVA_HOME=/usr/lib/jvm/java-11

0 3 * * * $JAVA_HOME/bin/java -jar /opt/app.jar > /dev/null 2>&1

百分号需要转义

在 crontab 中,% 有特殊含义(会被解释为换行),必须用反斜杠转义:

# ❌ 错误
0 3 * * * date +%F >> /tmp/date.log

# ✅ 正确
0 3 * * * date +\%F >> /tmp/date.log

实用示例

定时备份数据库

# 每天凌晨 3 点备份 MySQL,保留 7 天
0 3 * * * mysqldump -u root -p'your_password' dbname > /backup/db_$(date +\%Y\%m\%d).sql && find /backup -name "db_*.sql" -mtime +7 -delete > /dev/null 2>&1

定时清理日志

# 每周日凌晨 2 点清理 Nginx 30 天前的日志
0 2 * * 0 find /var/log/nginx -name "*.log.gz" -mtime +30 -delete > /dev/null 2>&1

定时监控服务

# 每 5 分钟检查 Nginx 是否在运行,挂了就自动重启
*/5 * * * * systemctl is-active nginx > /dev/null || systemctl restart nginx > /dev/null 2>&1

定时同步文件

# 每天凌晨 4 点用 rsync 同步数据到备份服务器
0 4 * * * rsync -avz --delete /data/ user@backup-server:/backup/data/ > /dev/null 2>&1

调试技巧

检查 Cron 日志

# CentOS
cat /var/log/cron

# Ubuntu
cat /var/log/syslog | grep CRON
# 或
journalctl -u cron

任务不执行怎么办

  1. 确认 Cron 服务在运行——systemctl status crond(CentOS)或 systemctl status cron(Ubuntu)
  2. 检查语法——确保 crontab 文件每行末尾没有多余空格,命令路径正确
  3. 手动执行命令——先把命令复制到终端手动跑一遍,确认能正常工作
  4. 检查输出重定向——如果没有重定向,查看系统邮件:mailcat /var/mail/username
  5. 检查权限——确保脚本有执行权限:chmod +x /opt/script.sh

Cron 目录方式

除了用 crontab -e 编辑,你还可以把脚本放到特定目录,系统会自动执行:

/etc/cron.hourly/     # 每小时
/etc/cron.daily/      # 每天
/etc/cron.weekly/     # 每周
/etc/cron.monthly/    # 每月

只需要把脚本放进去并赋予执行权限就行,不用写 cron 表达式。适合固定周期的简单任务。

总结

Crontab 就三步:查看(-l)、编辑(-e)、等它执行。记住几个要点:

  • 用绝对路径
  • 重定向输出
  • 转义百分号
  • 先手动测试再写入 crontab
crontab -e                              # 编辑定时任务
0 3 * * * /usr/bin/python3 /opt/job.py  # 示例:每天 3 点执行
systemctl status crond                  # 检查服务状态

掌握 Crontab,服务器的自动化运维就迈出了第一步。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享