Linux 定时任务(Cron)完整教程

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分钟,这是良好的实践:

  1. 避免多个脚本同时运行争抢资源

  2. 如果前一个脚本依赖某些数据,后一个可以等它完成

  3. 凌晨是服务器负载最低的时间段


五、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 验证
相关推荐
高山有多高16 分钟前
【Linux笔记】Linux自定义Shell
linux·c++
姜鱼问生22 分钟前
HTTPS 部署实战:未备案域名 + 非标端口的完整方案
linux·https
jackletter41 分钟前
linux:安装 ubuntu 26.04.1
linux·ubuntu·ubuntu26.04.1
打工仔折腾 AI1 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
2401_869769591 小时前
make 进度条
linux
天远数科1 小时前
零信任架构实战:基于天远运营商三要素简版V即时版查询构建自动化买手实名核验网关
运维·人工智能·架构·自动化
天衍四九-1 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
C++ 老炮儿的技术栈2 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
IT大白鼠2 小时前
搜索系列 · 第 04 篇——部署实操:内网集群落地
运维·elasticsearch·nosql
Elastic 中国社区官方博客2 小时前
使用 Jev 作为 search reranker:基准测试与实现方法
大数据·运维·elasticsearch·全文检索