在 Linux 系统中,我们经常需要让某些任务在特定时间自动执行,比如每天凌晨备份数据库、每小时清理日志、每周同步文件等。这类需求可以通过 定时任务(Cron Job) 来实现。
本文将带你全面了解 Linux 中最常用的定时任务工具 —— cron,从基础语法到实战配置,助你轻松掌握自动化运维的核心技能。
一、什么是 Cron?
Cron 是 Linux/Unix 系统中用于周期性执行任务的守护进程(daemon)。它读取配置文件(称为 crontab),按照设定的时间规则触发指定的命令或脚本。
- 配置文件:每个用户可拥有自己的
crontab 文件 - 默认位置:
/var/spool/cron/用户名(不同发行版可能略有差异)
“✅ 几乎所有 Linux 发行版都默认安装并启用了 cron 服务。
二、Crontab 语法详解
一条完整的定时任务由 6 个字段 组成(前 5 个是时间规则,第 6 个是命令):
分 时 日 月 周 命令
特殊符号说明:
三、常用时间表达式示例
# 分钟
* * * * * command # 每1分钟执行
*/5 * * * * command # 每5分钟执行
# 小时
0 * * * * command # 每小时执行
5 * * * * command # 每小时的第5分钟
1,50 * * * * command # 每小时的第1分钟和第50分钟执行
# 天
0 0 * * * command # 每天执行
0 1 * * * command # 每天凌晨1点执行
0 2 * * * command # 每天凌晨 2 点执行
30 4 * * * command # 每天的 4:30
25 8-11 * * * command # 每天 8~11点 的第 25 分钟执行
0 8 * * 1-5 command # 工作日(周一至周五)每早 8 点
# 月
20 7 8 * * command # 每月 8号 的 7:20 执行
30 4 10,20 * * command # 每月 10号和20号 的 4:30 执行
30 5 */10 * * command # 每个月中每隔 10天 的 5:30 执行
0 12 1,15 * * command # 每月 1 号和 15 号中午 12 点
# 星期
0 0 * * 0 command # 每周执行
0 9 * * 1 command # 每周一上午 9 点执行
30 6 * * 0 command # 每星期日的 6:30 执行
# 其他
0 0 1 1 * command # 每年执行
30 5 28 6 * command # 每年的 6月28号 5:30 执行
1,50 21-23 * * * command # 在21点到23点的第1和第50分钟执行
1,50 21-23 */2 * * command # 每隔两天在21点到23点的第1和第50分钟执行
30 4 * * * root run-parts /etc/cron.daily # 每天 4:30 以 root 身份执行 /etc/cron.daily 目录中的所有可执行文件
“⚠️ 注意:“日”和“周”字段是“或”的关系。例如 0 0 1 * 0 表示“每月 1 号 或 每周日”都会执行。
四、如何管理 Crontab?
编辑当前用户的定时任务
crontab -e
“首次使用会提示选择编辑器(如 vim、nano)。
查看当前用户的定时任务
crontab -l
删除所有定时任务
crontab -r
“⚠️ 谨慎使用!无法恢复。
为其他用户设置(需 root 权限)
crontab -u username -e
其他命令
# 服务状态
systemctl status crond
# 服务开启
systemctl start crond
# 服务关闭
systemctl stop crond
# 服务重启
systemctl restart crond
# 重新加载
systemctl reload crond
五、示例
示例1:创建一个每日备份任务
假设我们要每天凌晨 1:30 备份 MySQL 数据库,并记录日志:
30 1 * * * /opt/scripts/backup_db.sh >> /var/log/backup.log 2>&1
其中:
>> /var/log/backup.log 将标准输出追加到日志
“✅ 建议:确保脚本有执行权限(chmod +x backup_db.sh),且路径使用绝对路径!
示例2:每分钟输出当前时间到txt
crontab -e 开始编写,或者去/var/spool/cron/root下编写
* * * * * echo -e "$(date)" >> /log_crontab.txt
示例3:其他示例
# 定时每日凌晨1点清空 nohup.out日志
0 1 * * * find / -name "nohup.out" -exec rm -rf {} \;
# 设置定时备份gitlab
0 1,13 * * * gitlab-rake gitlab:backup:create
# 定时每日凌晨1点清空 2天前的备份记录 例如8月4日清空 8月2日之前的 包含8月1日 不包含8月2日
0 1 * * * find /home/work/docker_md/gitlab/data/backups -mtime +2 -name "*_gitlab_backup.tar" -exec rm -rf {} \;
六、常见问题与注意事项
环境变量问题
Cron 执行时的环境变量非常有限(如 PATH 可能不包含 /usr/local/bin)。
解决方案:
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /your/script.sh
百分号(%)转义问题
在 crontab 中,% 有特殊含义(表示换行),若命令中包含 %(如 date +%Y%m%d),必须用反斜杠转义:
0 0 * * * /bin/touch /tmp/file_$(date +\%Y\%m\%d).txt
邮件通知
默认情况下,cron 会将命令的输出通过邮件发送给用户(使用 mail 命令)。
如果不希望收到邮件,可重定向输出到 /dev/null:
0 3 * * * /script.sh > /dev/null 2>&1
系统级定时任务
除了用户 crontab,还有系统级任务:
/etc/crontab:主配置文件(支持指定运行用户)/etc/cron.d/:存放额外的 cron 配置文件(常用于软件包)/etc/cron.hourly/, /etc/cron.daily/ 等:按周期自动执行目录中的脚本
配置系统级别还是用户级别的定时任务?
Linux系统中的定时任务(cron jobs)可以配置在系统级别或用户级别。选择配置哪个级别取决于任务的需求和执行环境。
- 系统级别的定时任务通常由系统管理员配置,用于执行对整个系统或多个用户共享的任务。这些任务通常是系统维护、监控、日志切割等任务,需要以特权用户身份运行。系统级别的定时任务通常在 /etc/crontab 文件中配置,也可以在 /etc/cron.d/ 目录下的文件中配置。
- 用户级别的定时任务由各个用户自行配置,用于执行与单个用户相关的任务,如备份个人数据、发送提醒等。这些任务以普通用户的身份运行,不需要额外的特权。用户级别的定时任务通过每个用户的 crontab 文件进行配置,使用 crontab -e 命令编辑。
“通常情况下,对于单个用户的日常任务,推荐使用用户级别的定时任务。对于需要执行系统级操作或跨多个用户的共享任务,可以考虑使用系统级别的定时任务。在选择配置哪个级别的定时任务时,需要考虑任务的性质、执行环境和所需的权限。
七、替代方案
虽然 cron 是主流,但在现代系统中也有其他选择:
- systemd timers:适用于使用 systemd 的系统(如 CentOS 7+、Ubuntu 16.04+),更灵活。
- at:用于执行一次性任务(如
at now + 1 hour)。 - anacron:适合不常开机的设备(如笔记本),确保错过任务仍能补执行。
八、总结
- ✅ 掌握
crontab -e 和时间表达式是关键。 - ✅ 定期检查日志(如
tail -f /var/log/cron)可快速定位问题。
“🌟 小技巧:不确定时间表达式是否正确?可用在线工具 https://crontab.guru 快速验证!