本文目录导读:

- 最基础:Linux系统自带的 Cron (Crontab)
- 最流行:Java + XXL-JOB (分布式定时任务)
- 轻量级:Python 的 schedule 库 (适合单机脚本)
- 企业级:Elastic-Job (Apache ShardingSphere)
- 总结:如何选择?
这是一个很宽泛的问题,因为“开源定时任务”可以指代编程语言自带的库(如 Python 的 schedule)、Linux/Unix 系统本身的任务调度器(crontab),或者分布式任务调度框架(如 XXL-JOB、Quartz、Elastic-Job 等)。
下面我会从最常用、最基础的 Linux crontab,到最流行的 分布式任务调度框架,分别讲解如何配置。
最基础:Linux系统自带的 Cron (Crontab)
如果你的需求是“在服务器上,每天/每小时跑一个脚本”,这是最推荐的方式。
配置文件编辑
在终端输入以下命令来编辑当前用户的定时任务:
crontab -e
(如果是第一次使用,系统会提示你选择编辑器,选 vim 或 nano 都可以)
配置表达式格式
配置文件的每行代表一个任务,格式如下:
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期 (0 - 7) (0和7都代表周日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日期 (1 - 31)
│ └──────── 小时 (0 - 23)
└────────── 分钟 (0 - 59)
常用配置示例
| 需求 | crontab 表达式 |
|---|---|
| 每天凌晨 2:30 执行 | 30 2 * * * /path/script.sh |
| 每 5 分钟执行一次 | */5 * * * * /path/script.sh |
| 每周一早上 8 点 | 0 8 * * 1 /path/script.sh |
| 每月 1 号和 15 号执行 | 0 0 1,15 * * /path/script.sh |
| 每天 9-18 点每 2 小时 | 0 9-18/2 * * * /path/script.sh |
重要配置技巧
- 使用绝对路径:cron 的环境变量很少,脚本里的命令(如
python3)最好写全路径。 - 日志输出:如果想看执行结果,可以重定向输出:
0 2 * * * /usr/bin/python3 /path/script.py >> /var/log/mytask.log 2>&1 - 查看已有任务:
crontab -l(list) - 删除所有任务:
crontab -r(remove)
最流行:Java + XXL-JOB (分布式定时任务)
如果你有多个服务器、任务需要管理界面、执行失败要告警,这是目前国内最流行的方案。
架构理解
- 调度中心:一个 Web 项目,负责按时间触发任务。
- 执行器:你的业务项目,里面写着“任务要干什么”。
配置步骤(关键步骤)
第一步:启动调度中心
从 GitHub/码云下载 XXL-JOB 源码,修改 application.properties 里的数据库连接,然后运行 xxl-job-admin 模块,访问 http://localhost:8080/xxl-job-admin,默认账号密码 admin/123456。
第二步:在你的业务项目中引入执行器依赖
<!-- pom.xml -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
第三步:配置执行器(application.yml)
xxl:
job:
admin:
addresses: http://localhost:8080/xxl-job-admin
executor:
appname: my-executor # 执行器名称,必须与调度中心注册的一致
port: 9999 # 执行器端口
logpath: /data/applogs/xxl-job/jobhandler/
第四步:在代码中写一个定时任务
@Component
public class MyTask {
@XxlJob("mySimpleJob")
public void execute() {
System.out.println("定时任务执行了!当前时间:" + new Date());
// 这里放你的业务逻辑
}
}
第五步:在调度中心配置调度
- 进入调度中心 → 执行器管理 → 新增执行器(
AppName填my-executor)。 - 进入任务管理 → 新增任务:
- JobHandler:填
mySimpleJob(和代码里一致)。 - Cron:填
0 0/5 * * * ?(每5分钟一次,这是 Quartz 格式)。 - 路由策略:单机串行(单台)、轮询(多台)等。
- JobHandler:填
- 点击启动。
轻量级:Python 的 schedule 库 (适合单机脚本)
如果你会 Python,而且是跑一些爬虫或简单脚本,这个库很简洁。
安装
pip install schedule
配置代码示例
import schedule
import time
def job():
print("I'm working...")
# 配置规则
schedule.every(10).minutes.do(job) # 每10分钟
schedule.every().day.at("10:30").do(job) # 每天10:30
schedule.every().monday.do(job) # 每周一
while True:
schedule.run_pending()
time.sleep(1)
注意:该库是阻塞式的,需要保持 Python 进程一直在前台运行(可用 nohup 或 systemd 保活)。
企业级:Elastic-Job (Apache ShardingSphere)
类似 XXL-JOB,但更侧重于任务分片(比如你有100万条数据,分给3台机器一起处理)。
配置重点
- 引入依赖:
elastic-job-lite-spring-boot-starter - 配置文件:
elasticjob.server-lists=localhost:2181 # ZooKeeper 地址 elasticjob.namespace=my-job
- 代码注解:
@ElasticJob( name = "myShardingJob", cron = "0/5 * * * * ?", shardingTotalCount = 3 # 分3片 ) public class MyJob implements SimpleJob { @Override public void execute(ShardingContext context) { // context.getShardingItem() 获取当前分片项 (0, 1, 2) } }
如何选择?
| 方案 | 适用场景 | 复杂度 | 需要服务端 |
|---|---|---|---|
| Linux Crontab | 单机、简单的运维脚本 | 否 | |
| Python schedule | 单机、快速开发、原型验证 | 否 | |
| XXL-JOB | 中小团队、多服务、需要管理界面 | 是 | |
| Elastic-Job | 大型系统、数据量大、需要分片处理 | 是 |
给新手的建议:
- 先学 crontab,它几乎每台 Linux 服务器都有。
- 如果项目需要可视化运维,直接上手 XXL-JOB,官方文档很详细,社区活跃。
- 如果只是临时跑个脚本,用 Python
schedule最快。
如果你有更具体的开发语言(Go、Node.js)或场景(爬虫、消息队列),可以告诉我,我再给你定制化的配置方案。