Linux 定时任务(Cron)完整教程
一、什么是 Cron?
Cron 是 Linux/Unix 系统的定时任务调度器。它按照你设定的时间规则,自动、周期性地执行命令或脚本,无需人工干预。
二、Crontab 时间格式(5个星号)
每个定时任务一行,格式如下:
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都表示周日)
│ │ │ │ │
* * * * * 要执行的命令
常用特殊符号
| 符号 | 含义 | 示例 |
|---|---|---|
* |
任意值 | * * * * * 每分钟执行 |
, |
列表 | 1,15 表示1日和15日 |
- |
范围 | 1-5 表示周一到周五 |
/ |
间隔 | */5 表示每5分钟 |
# |
注释 | 行首加 # 表示注释掉 |
三、用 Nano 编辑 Crontab 的完整步骤
步骤 1:打开当前用户的定时任务表
crontab -e
第一次执行时会提示选择编辑器,输入
1选择 nano(如果没有提示,系统默认可能就是 nano)。
步骤 2:在 Nano 中编写任务
进入 nano 后,你会看到一个空白或已有内容的文件。直接输入你的定时任务(实战过的案例):
# 每月 1 日、15 日导出 7 张资源表
0 2 1,15 * * /home/yyh/code/searchAssocia/wordlib/scripts/run_resource_export.sh
# 每天导出前 30 天 SearchRequest 聚合
0 3 * * * /home/yyh/code/searchAssocia/wordlib/scripts/run_daily_sensor_export.sh
# 每天构建、审核、发布词库到 MySQL
20 3 * * * /home/yyh/code/searchAssocia/wordlib/scripts/run_daily_word_lib_cron.sh
# 每天构建 BGE-M3 相似词向量库与本地快照
0 4 * * * /home/yyh/code/searchAssocia/wordlib/scripts/run_daily_similarity_cron.sh
步骤 3:保存并退出 Nano
| 操作 | 快捷键 |
|---|---|
| 保存文件 | Ctrl + O(然后按 Enter 确认) |
| 退出 nano | Ctrl + X |
如果修改后按
Ctrl + X,nano 会询问是否保存,按Y确认,再按Enter即可。
步骤 4:验证任务是否写入成功
crontab -l
这会列出当前用户的所有定时任务,检查你刚写的内容是否正确。
四、逐条解析你的案例
| 任务 | 时间表达式 | 含义 |
|---|---|---|
| 导出资源表 | 0 2 1,15 * * |
每月1日和15日,凌晨2:00 执行 |
| 导出 SearchRequest | 0 3 * * * |
每天凌晨3:00 执行 |
| 构建词库 | 20 3 * * * |
每天凌晨3:20 执行 |
| 构建向量库 | 0 4 * * * |
每天凌晨4:00 执行 |
时间编排的巧妙之处
注意这四个任务的时间安排:
2:00→3:00→3:20→4:00
彼此间隔至少20分钟,这是良好的实践:
-
避免多个脚本同时运行争抢资源
-
如果前一个脚本依赖某些数据,后一个可以等它完成
-
凌晨是服务器负载最低的时间段
五、Crontab 常用命令速查
crontab -e # 编辑当前用户的定时任务
crontab -l # 列出当前用户的定时任务
crontab -r # 删除当前用户的所有定时任务(慎用!)
六、重要注意事项
1. 脚本必须有执行权限
chmod +x /home/yyh/code/searchAssocia/wordlib/scripts/run_resource_export.sh
2. 建议使用绝对路径
Cron 的执行环境变量和用户登录后的环境不同,务必使用绝对路径:
-
✅
/home/yyh/code/.../script.sh -
❌
~/code/.../script.sh或./script.sh
3. 脚本中涉及的环境变量
如果脚本依赖特定的环境变量(如 PATH、JAVA_HOME 等),建议在脚本开头显式设置,或在 crontab 顶部声明:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
HOME=/home/yyh
0 2 1,15 * * /home/yyh/.../run_resource_export.sh
4. 输出重定向(排查问题必备)
建议将脚本的输出和错误写入日志文件,方便排查:
0 2 1,15 * * /home/yyh/.../run_resource_export.sh >> /home/yyh/logs/resource_export.log 2>&1
-
>>表示追加输出到日志 -
2>&1表示把错误输出(stderr)也合并到标准输出(stdout)
5. 测试脚本能否独立运行
在写入 crontab 之前,先手动执行一次脚本,确保它本身没问题:
/home/yyh/code/searchAssocia/wordlib/scripts/run_resource_export.sh
七、快速参考:常见时间规则
| 需求 | 表达式 |
|---|---|
| 每分钟 | * * * * * |
| 每5分钟 | */5 * * * * |
| 每小时整点 | 0 * * * * |
| 每天凌晨2点 | 0 2 * * * |
| 每周一早上8点 | 0 8 * * 1 |
| 每月1号凌晨3点 | 0 3 1 * * |
| 每月1号和15号 | 0 0 1,15 * * |
| 工作日(周一到周五)早上9点 | 0 9 * * 1-5 |
| 每2小时 | 0 */2 * * * |
八、总结流程图
1. 写好并测试脚本 ──→ 2. chmod +x 给执行权限
↓
3. crontab -e 打开编辑器 ──→ 4. 用 nano 写入任务
↓
5. Ctrl+O 保存 ──→ 6. Ctrl+X 退出 ──→ 7. crontab -l 验证