开源定时任务该如何配置?

wen 开源项目 44

本文目录导读:

开源定时任务该如何配置?

  1. 最基础:Linux系统自带的 Cron (Crontab)
  2. 最流行:Java + XXL-JOB (分布式定时任务)
  3. 轻量级:Python 的 schedule 库 (适合单机脚本)
  4. 企业级:Elastic-Job (Apache ShardingSphere)
  5. 总结:如何选择?

这是一个很宽泛的问题,因为“开源定时任务”可以指代编程语言自带的库(如 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());
        // 这里放你的业务逻辑
    }
}

第五步:在调度中心配置调度

  1. 进入调度中心 → 执行器管理 → 新增执行器(AppNamemy-executor)。
  2. 进入任务管理 → 新增任务:
    • JobHandler:填 mySimpleJob(和代码里一致)。
    • Cron:填 0 0/5 * * * ?(每5分钟一次,这是 Quartz 格式)。
    • 路由策略:单机串行(单台)、轮询(多台)等。
  3. 点击启动。

轻量级: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 进程一直在前台运行(可用 nohupsystemd 保活)。


企业级:Elastic-Job (Apache ShardingSphere)

类似 XXL-JOB,但更侧重于任务分片(比如你有100万条数据,分给3台机器一起处理)。

配置重点

  1. 引入依赖elastic-job-lite-spring-boot-starter
  2. 配置文件
    elasticjob.server-lists=localhost:2181  # ZooKeeper 地址
    elasticjob.namespace=my-job
  3. 代码注解
    @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 大型系统、数据量大、需要分片处理

给新手的建议

  1. 先学 crontab,它几乎每台 Linux 服务器都有。
  2. 如果项目需要可视化运维,直接上手 XXL-JOB,官方文档很详细,社区活跃。
  3. 如果只是临时跑个脚本,用 Python schedule 最快。

如果你有更具体的开发语言(Go、Node.js)或场景(爬虫、消息队列),可以告诉我,我再给你定制化的配置方案。

抱歉,评论功能暂时关闭!