Linux 定时任务工具 crontab 配置详解

[复制链接]
发表于 2026-10-3 22:52:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

cron 是 Linux 内置的定时任务工具,按预设的时间规则周期性地执行命令或脚本。从日志日志清理到备份巡检,几乎每台服务器上都能看到它的身影。这篇把字段含义、语法糖、踩坑点一次讲清。

一、基础概念与布局

时间规则由 5 个字段组成,格式是:分 时 日 月 周 执行命令。

字段取值范围
分钟0-59
小时0-23
日期1-31
月份1-12(也可写英文缩写)
星期0-7(0 和 7 都表示周日)

二、操作命令

crontab -e                  # 编辑当前用户的任务
crontab -u username -e      # 编辑指定用户的任务(需权限)

crontab -l                  # 查看当前用户任务
crontab -u username -l      # 查看指定用户任务

文件存储位置

  • 用户级任务:/var/spool/cron/(RHEL/CentOS)或 /var/spool/cron/crontabs/(Debian/Ubuntu)。
  • 系统级任务:/etc/crontab 与 /etc/cron.d/ 目录。

三、时间规则的特殊符号

符号含义示例说明
*任意值0 * * * *每小时整点执行
,多个时间点0 5,17 * * *每天 5 点和 17 点执行
-时间范围0 0-6 * * *每天 0-6 点整点执行
/n间隔频率*/10 * * * *每 10 分钟执行

四、典型场景写法

* * * * * /bin/sh script.sh        # 每分钟执行一次
0 2 * * * /bin/sh script.sh        # 每天 02:00 执行一次
0 17 * * sun /bin/sh script.sh     # 每周日 17:00 执行一次
*/10 * * * * /bin/sh script.sh     # 每 10 分钟执行一次

想要 30 秒执行一次

crontab 的最小粒度是 1 分钟,硬要 30 秒只能拆成两条任务配合 sleep:

* * * * * /bin/sh script.sh
* * * * * sleep 30; /bin/sh script.sh

复合时间条件

0 17 * * 5,7 /bin/sh script.sh                  # 每周五、周日 17 点
0 4,17 * * 5,7 /bin/sh script.sh                # 每周五、周日 4 点和 17 点
* * * jan,may,aug * /bin/sh script.sh           # 每年 1、5、8 月的每分钟

带条件判断

例如"每月第一个周日的凌晨 2 点执行":

0 2 * * sun [ $(date +%d) -le 07 ] && /bin/sh script.sh

逻辑拆开看:0 2 * * sun 是时间表达式,每周日 2:00 触发;命令部分 [ $(date +%d) -le 07 ] 里,$(date +%d) 取当前"日"字段,-le 07 判断是否 ≤ 7(也就是每月前 7 天)。两者同时满足才执行脚本。这种写法适合月度首周归档、跨周期报表这类需求。

系统级任务

系统级任务格式里必须多写一项用户:

0 4 * * * root /bin/bash restart_service.sh

五、时间宏(语法糖)

宏等效表达式说明
@yearly0 0 1 1 *每年 1 月 1 日 00:00 执行
@monthly0 0 1 * *每月 1 日 00:00 执行
@daily0 0 * * *每天 00:00 执行
@hourly0 * * * *每小时整点执行
@reboot无等效表达式系统启动时执行

@yearly 只能精确到"年",像"每年 6 月 1 日"这种仍需用标准表达式。

# 用户级:每年清理一次临时文件
@yearly find /tmp -type f -mtime +365 -delete

# 系统级:生成年度报告(需 root)
@yearly root /opt/reports/generate_annual_report.sh

六、配置的几个注意点

1. 环境变量问题

crontab 默认使用一套极简环境变量,PATH 里未必有你习惯的路径。建议在脚本里用绝对路径,或在任务中显式声明 PATH,否则经常出现命令找不到。

2. 日志日志与调试

  • 执行记录:/var/log/cron。
  • 输出重定向:0 * * * * /script.sh > /log.txt 2>&1,不重定向的话输出会作为邮件发给对应用户。

3. 服务管理

systemctl restart crond     # 改完系统级配置后重启服务(CentOS 7+ 的服务名是 crond,Ubuntu 多为 cron)

4. 备份与恢复

crontab -l > cron_backup.txt     # 备份
crontab cron_backup.txt          # 恢复

七、小结

  • 五个字段:分、时、日、月、周,星号、逗号、短横、斜杠四个符号覆盖绝大多数需求。
  • 写脚本用绝对路径、输出重定向、任务前声明 PATH,能避开九成"本地跑得好好的服务器不执行"的坑。
  • 30 秒级任务靠两条任务加 sleep 拆分;常见周期用 @daily、@hourly 这类宏更整洁。
  • 完整手册查 man crontab,改完最好加个测试任务验证是否真的触发。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表