Cron详解

一、介绍

Cron表达式是一种用于指定定时任务的时间表达式,常用来指定任务的执行时间、执行频率和执行间隔。它由6~7个字段组成,分别表示秒、分、时、日期、月份、星期、年份(可省略)。cron 是一个非常灵活和强大的工具,几乎可以用于任何需要定期执行的任务。

二、cron格式以及字符含义

cron表达式通常以这种格式出现:0 15 10 * * ? 2024 (2024年的每天上午10:15触发)

0   15  10   *     *     ?   2024
秒  分  时  日期  月份  星期  年份

字段

是否必需

取值范围

特殊字符

[0, 59]

* , - /

[0, 59]

* , - /

[0, 23]

* , - /

日期

[1, 31]

* , - / ? L W

月份

[1, 12]或[JAN, DEC]

* , - /

星期

[1, 7]或[MON, SUN]。若您使用[1, 7]表达方式,1代表星期一,7代表星期日。

注:

Cron表达式的使用方法和含义可能会根据不同的系统、框架或工具有所差异。若您在其他地方使用Cron表达式,1可能表示星期日,7表示星期六,具体以实际情况为准。

* , - / ? L #

年份

[当前年份,2099]

* , - /

特殊字符

含义

示例

*

匹配任意值。

在字段中,*表示每个月。

,

列出枚举值。

在字段分钟中,5,20表示分别在5分钟和20分钟触发一次。

-

指定范围。

在字段分钟中,5-20表示从5分钟到20分钟之间每隔一分钟触发一次。

/

指定数值的增量。

在字段分钟中,0/15表示从第0分钟开始,每15分钟。在字段分钟3/20表示从第3分钟开始,每20分钟。

?

不指定值,仅用于日期和星期。

当字段日期星期其中之一被指定了值以后,为了避免冲突,需要将另一个字段的值设为?

L

单词Last的首字母,表示最后一天,仅字段日期星期支持该字符。

注:

指定L字符时,避免指定列表或范围,否则会导致逻辑问题。

  • 在字段日期中,L表示某个月的最后一天。在字段星期中,L表示一个星期的最后一天,也就是星期日(SUN)。

  • 如果在L前有具体的内容,例如,在字段星期中的6L表示这个月的最后一个星期六。

W

除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件。W字符寻找最近有效工作日时不会跨过当前月份,连用字符LW时表示为指定月份的最后一个工作日。

在字段日期5W,如果5日是星期六,则将在最近的工作日星期五,即4日触发。如果5日是星期天,则将在最近的工作日星期一,即6日触发;如果5日在星期一到星期五中的一天,则就在5日触发。

#

确定每个月的第几个星期几。

注:

仅字段星期支持该字符。

在字段星期中,4#2表示某月的第二个星期四。

三、常用的cron表达式

场景

取值

每天固定时间执行

每天上午10:15执行任务

0 15 10 ? * *

每天中午12:00执行任务

0 0 12 * * ?

每天多个固定时间执行

每天上午10:00点、下午14:00以及下午16:00执行任务

0 0 10,14,16 * * ?

每间隔一段时间执行

每天上午09:00到下午17:00时间段内每隔半小时执行任务

0 0/30 9-17 * * ?

每天下午14:00到下午14:59时间段内每隔1分钟执行任务

0 * 14 * * ?

每天下午14:00到下午14:05时间段内每隔1分钟执行任务

0 0-5 14 * * ?

每天下午14:00到下午14:55时间段内每隔5分钟执行任务

0 0/5 14 * * ?

每天下午14:00到下午14:55、下午18:00到下午18:55时间段内每隔5分钟执行任务

0 0/5 14,18 * * ?

特定星期/日期执行

每个星期三中午12:00执行任务

0 0 12 ? * WED

每月15日上午10:15执行任务

0 15 10 15 * ?

每月最后一日上午10:15执行任务

0 15 10 L * ?

每月最后一个星期六上午10:15执行任务

0 15 10 ? * 6L

每月第三个星期六上午10:15执行任务

0 15 10 ? * 6#3

特定年份的特定日期执行

每年3月的每个星期三下午14:10和14:44执行任务

0 10,44 14 ? 3 WED

2022年每天上午10:15执行任务

0 15 10 ? * * 2022

每年每天上午10:15执行任务

0 15 10 ? * * *

2022年每天下午14:00到下午14:55、下午18:00到下午18:55时间段内每隔5分钟执行任务

0 0/5 14,18 * * ? 2022

2022年至2023年每月第三个星期六上午10:15执行任务

0 15 10 ? * 6#3 2022,2023

2022年至2025年每天上午09:00到下午17:30时间段内每隔半小时执行任务

0 0/30 9-17 * * ? 2022-2025

从2022年开始,每隔两年3月的每个星期三下午14:10和14:44执行任务

0 10,44 14 ? 3 WED 2022/2

四、定时任务调度功能(C#)

如果你只是需要简单的定时执行任务,System.Threading.Timer 或 System.Timers.Timer 可以满足需求。如果你需要更复杂的调度(例如类似 cron 的功能),你可以使用 Quartz.NET

  • 方法 1: 使用 System.Threading.Timer

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 设置每隔10秒执行一次定时任务
        TimerCallback timerCallback = new TimerCallback(ExecuteTask);
        Timer timer = new Timer(timerCallback, null, 0, 10000); // 0 毫秒延迟,10000 毫秒间隔

        // 防止程序立即退出
        Console.WriteLine("Press [Enter] to exit.");
        Console.ReadLine();
    }

    static void ExecuteTask(object state)
    {
        // 你要定期执行的任务
        Console.WriteLine("Task executed at: " + DateTime.Now);
    }
}

Timer 允许你设定一个回调函数,并在指定的间隔时间内反复调用它。你可以通过修改 Timer 的构造函数来控制任务的执行频率。

  • 方法 2: 使用 System.Timers.Timer

using System;
using System.Timers;

class Program
{
    static Timer _timer;

    static void Main()
    {
        // 设置定时器,每5秒执行一次任务
        _timer = new Timer(5000); // 设置间隔为5000毫秒(5秒)
        _timer.Elapsed += OnTimedEvent;
        _timer.AutoReset = true; // 如果为true,定时器会一直重复触发
        _timer.Enabled = true;   // 启动定时器

        // 防止程序立即退出
        Console.WriteLine("Press [Enter] to exit.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        // 你要定期执行的任务
        Console.WriteLine("Task executed at: " + e.SignalTime);
    }
}

System.Timers.Timer 是另一个可以用来定时执行任务的类,它比 Threading.Timer 提供了更多的功能,特别适用于需要定期触发事件的场景。System.Timers.Timer 提供了 Elapsed 事件,每当计时器达到指定的时间间隔时,该事件就会被触发。设置 AutoReset = true 可以使计时器在每次事件触发后自动重启。

  • 方法 3: 使用第三方库(如Quartz.NET)

Quartz.NET 是一个功能强大的定时任务调度框架,它支持基于类似 cron 的表达式来配置任务。

using Quartz;
using Quartz.Impl;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建调度器
        IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
        await scheduler.Start();

        // 定义一个作业(Job)
        IJobDetail job = JobBuilder.Create<HelloJob>()
            .WithIdentity("job1", "group1")
            .Build();

        // 创建一个触发器(Trigger),使用 cron 表达式来定义执行时间
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .WithCronSchedule("0/5 * * * * ?") // 每 5 秒执行一次
            .Build();

        // 将作业和触发器添加到调度器
        await scheduler.ScheduleJob(job, trigger);

        // 等待直到用户按键退出
        Console.WriteLine("Press [Enter] to exit.");
        Console.ReadLine();

        // 停止调度器
        await scheduler.Shutdown();
    }
}

public class HelloJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Task executed at: " + DateTime.Now);
        return Task.CompletedTask;
    }
}

在上述代码中,WithCronSchedule("0/5 * * * * ?")表示任务每 5 秒执行一次。你可以使用类似 cron 的表达式来灵活地定义任务执行的频率。

五、cron适用场景

1. 定期备份

  • 数据库备份:使用 cron 定期备份数据库,例如 MySQL 或 PostgreSQL 数据库,以确保数据安全。
  • 文件备份:定期备份重要文件和目录,避免数据丢失。

2. 系统维护

  • 清理临时文件:定期删除临时文件或日志文件,以释放磁盘空间。
  • 更新系统:自动执行系统更新或安装安全补丁。

3. 数据同步

  • 文件同步:使用 rsync 或其他工具定期同步本地和远程服务器的数据。
  • 数据库同步:定期将数据从主数据库同步到备用数据库。

4. 监控和报告

  • 系统监控:定期检查系统资源(如 CPU、内存、磁盘使用情况)并生成报告。
  • 网站监控:定期检查网站的可用性,发送警报或报告。

5. 发送电子邮件

  • 定期报告:通过脚本生成定期报告并发送电子邮件。
  • 提醒和通知:发送定期的提醒或通知,例如待办事项、会议提醒等。

6. 自动化任务

  • 数据处理:定期运行数据处理脚本,例如 ETL(提取、转换、加载)任务。
  • 生成静态网页:定期生成和更新静态网页内容。

7. 日志轮转

  • 日志管理:使用 cron 进行日志轮转,定期压缩和归档旧日志文件。

8. 定时启动服务

  • 启动和停止服务:定期启动或停止特定服务,例如定期重启 Web 服务器。

9. 开发和测试

  • 自动化测试:定期运行自动化测试脚本,确保代码质量和功能正常。
  • 构建和部署:定期构建和部署应用程序,特别是在持续集成/持续部署(CI/CD)环境中。

10. 数据抓取

  • 网页抓取:定期抓取特定网站的数据,进行数据分析或存储。

参考:cron表达式_阿里云帮助文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小玉兒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值