Linux crontab 定时任务配置完全指南:从入门到精通

Linux crontab 定时任务配置完全指南:从入门到精通

Someone Lv5

Linux crontab 是 Unix/Linux 系统中最经典的定时任务调度工具。无论是定时备份数据库、定期清理日志、自动更新系统、还是定时发送邮件通知,crontab 都能高效胜任。本文将全面介绍 crontab 的使用方法,从基础语法到高级技巧,帮助你彻底掌握 Linux 定时任务管理。

什么是 crontab?

crontab 是 cron table 的缩写。cron 是 Linux 系统的守护进程(daemon),负责在指定时间自动执行预定义的任务。每个用户都可以拥有独立的 crontab 文件来管理自己的定时任务。

1
systemctl status cron     # 查看 cron 服务状态

如果 cron 未运行,可以用以下命令启动:

1
sudo systemctl enable --now cron

crontab 命令基础

常用命令

命令说明
crontab -l列出当前用户的定时任务
crontab -e编辑当前用户的定时任务(默认用 vi)
crontab -r删除当前用户的所有定时任务
crontab -u username -l查看指定用户的定时任务(需要 root 权限)
crontab -u username -e编辑指定用户的定时任务

首次编辑

第一次执行 crontab -e 时,系统会提示选择编辑器。建议选择 nano(新手友好)或 vim(功能强大)。后续想更换编辑器可以用:

1
2
3
select-editor          # Debian/Ubuntu
export EDITOR=vim # 临时切换
crontab -e

crontab 时间语法 - 五段式

crontab 的核心是时间表达式,由 5 个字段组成:

1
2
3
4
5
6
7
8
* * * * * command_to_execute
─ ─ ─ ─ ─
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0和7都表示周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)

特殊字符

字符含义示例
*所有可能的值* * * * * 每分钟执行一次
,列举多个值1,15,30 * * * * 每小时的第1、15、30分钟执行
-范围9-17 * * * * 每天9点到17点每小时执行
/步长*/5 * * * * 每5分钟执行一次

常用时间表达式

表达式含义
*/5 * * * *每5分钟
0 * * * *每小时整点
0 9 * * *每天早上9点
0 9,18 * * *每天早上9点和下午6点
0 2 * * *每天凌晨2点
0 0 * * *每天午夜0点
0 0 * * 0每周日午夜0点
0 0 1 * *每月1日午夜0点
0 0 1 1 *每年1月1日午夜0点
*/30 9-18 * * 1-5工作日9点到18点每30分钟

实战示例

1. 定时备份数据库

每天凌晨3点备份 MySQL 数据库,保留最近7天的备份:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建备份脚本
cat > /usr/local/bin/backup-mysql.sh << 'SCRIPT'
#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DB_NAME="myblog"
DATE=$(date +\%Y\%m\%d_\%H\%M\%S)
mysqldump -u root "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
# 删除 7 天前的旧备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
SCRIPT

chmod +x /usr/local/bin/backup-mysql.sh

# crontab 中写入
0 3 * * * /usr/local/bin/backup-mysql.sh

2. 定期清理日志文件

每周日凌晨4点清理 Nginx 日志:

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

3. 监控磁盘空间

每小时检查磁盘使用率,超过 90% 发送邮件告警:

1
0 * * * * df -h | awk '$5+0 > 90 {print $0}' | mail -s "Disk Alert" admin@example.com

4. 定时更新 SSL 证书(配合 certbot)

1
2
# 每月1日和15日凌晨2点尝试续期
0 2 1,15 * * certbot renew --quiet

5. 定时同步文件(配合 rsync)

1
2
# 每天凌晨1点同步远程目录到本地备份
0 1 * * * rsync -avz --delete user@remote:/data/ /backup/data/

进阶技巧

1. 日志管理

crontab 默认将输出通过邮件发送给用户。对于生产环境,建议重定向日志:

1
2
3
4
5
6
7
8
# 将标准输出和错误输出分别记录到文件
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# 或丢弃所有输出(不推荐,不利于排查问题)
0 2 * * * /usr/local/bin/backup.sh > /dev/null 2>&1

# 按日期分文件记录日志
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup_$(date +\%Y\%m\%d).log 2>&1

注意:在 crontab 中 % 是特殊字符,需要转义为 \%

2. 环境变量问题

cron 执行时不会加载用户的 shell 配置文件(如 ~/.bashrc~/.bash_profile),因此 PATH 环境变量非常有限。解决方法:

方法一:在脚本开头设置环境变量

1
2
3
4
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH
# 继续执行任务...

方法二:在 crontab 中设置

1
2
3
4
5
6
# 在定时任务定义前设置环境变量
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com

0 2 * * * /usr/local/bin/backup.sh

3. 避免任务重叠

对于长时间运行的任务,需要防止上一个任务还没完成下一个就又开始执行。使用 flock 机制:

1
2
# 使用文件锁防止重叠
*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /usr/local/bin/myjob.sh

4. systemd timer - crontab 的现代替代

如果使用较新的 Linux 发行版,可以考虑用 systemd timer 替代 crontab,它提供更精确的控制和更好的日志管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 timer 单元
cat > /etc/systemd/system/mybackup.timer << 'EOF'
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

# 创建对应的 service 单元
cat > /etc/systemd/system/mybackup.service << 'EOF'
[Unit]
Description=Database Backup Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF

# 启用并启动 timer
systemctl daemon-reload
systemctl enable --now mybackup.timer

调试与排查

1. 查看 cron 执行日志

1
2
3
4
5
6
7
8
# Debian/Ubuntu
sudo tail -f /var/log/syslog | grep CRON

# RHEL/CentOS/Fedora
sudo tail -f /var/log/cron

# 只显示失败的执行
sudo journalctl -u cron --since today | grep -i fail

2. 常见问题排查

症状可能原因解决方法
任务未执行cron 服务未运行systemctl status cron 检查并启动
命令找不到PATH 环境变量未设置在脚本中使用绝对路径或设置 PATH
脚本未生效脚本权限不足chmod +x script.sh
日志无输出输出重定向未配置使用 >> /path/to/log 2>&1
时间不对系统时区有误使用 timedatectl 检查并修正时区
% 被截断crontab 中 % 未转义使用 \% 转义百分号

3. 手动测试脚本

在正式加入 crontab 之前,先手动测试脚本是否能正常运行:

1
2
# 模拟 cron 环境(不加载用户配置文件)
env -i HOME="$HOME" LOGNAME="$USER" SHELL=/bin/sh PATH=/usr/bin:/bin /usr/local/bin/backup.sh

安全提醒

  1. cron.allow 和 cron.deny:系统管理员可以通过这两个文件控制哪些用户可以使用 crontab。/etc/cron.allow 优先级更高。
  2. 避免使用 root 执行不必要的任务:尽量使用普通用户权限运行定时任务。
  3. 日志轮转:长时间运行的 crontab 日志文件会非常大,建议配置 logrotate。
  4. 监控告警:关键定时任务失败时应当有通知机制。
1
2
3
4
# 示例:cron.allow 和 cron.deny 用法
echo "root" > /etc/cron.allow # 仅允许 root 用户
echo "www-data" >> /etc/cron.allow # 同时允许 www-data
# 不在 cron.allow 中的其他用户将被拒绝

总结

crontab 是 Linux 运维中最基本也是最强大的工具之一。掌握它可以帮助你:

  • 自动化重复性运维工作(备份、清理、监控)
  • 定时执行业务逻辑(数据同步、报表生成)
  • 配合脚本实现复杂的定时任务编排

核心要点总结:

  1. 时间表达式:五段式(分、时、日、月、周)
  2. 特殊字符:*,-/
  3. 环境变量:PATH 必须显式设置,否则命令可能找不到
  4. 日志管理:务必重定向输出,方便排查问题
  5. 安全实践:最小权限原则,使用 cron.allow 控制

掌握了 crontab,你就掌握了 Linux 自动化运维的钥匙。

本文由AI辅助生成,内容仅供参考

  • 标题: Linux crontab 定时任务配置完全指南:从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-07 22:42:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-07-crontab-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。