一、介绍
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]表达方式, 注: Cron表达式的使用方法和含义可能会根据不同的系统、框架或工具有所差异。若您在其他地方使用Cron表达式,1可能表示星期日,7表示星期六,具体以实际情况为准。 | * , - / ? L # |
年份 | 否 | [当前年份,2099] | * , - / |
特殊字符 | 含义 | 示例 |
| 匹配任意值。 | 在字段 |
| 列出枚举值。 | 在字段 |
| 指定范围。 | 在字段 |
| 指定数值的增量。 | 在字段 |
| 不指定值,仅用于日期和星期。 | 当字段 |
| 单词Last的首字母,表示最后一天,仅字段 注: 指定 |
|
| 除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件。 | 在字段 |
| 确定每个月的第几个星期几。 注: 仅字段 | 在字段 |
三、常用的cron表达式
场景 | 取值 | |
每天固定时间执行 | 每天上午10:15执行任务 |
|
每天中午12:00执行任务 |
| |
每天多个固定时间执行 | 每天上午10:00点、下午14:00以及下午16:00执行任务 |
|
每间隔一段时间执行 | 每天上午09:00到下午17:00时间段内每隔半小时执行任务 |
|
每天下午14:00到下午14:59时间段内每隔1分钟执行任务 |
| |
每天下午14:00到下午14:05时间段内每隔1分钟执行任务 |
| |
每天下午14:00到下午14:55时间段内每隔5分钟执行任务 |
| |
每天下午14:00到下午14:55、下午18:00到下午18:55时间段内每隔5分钟执行任务 |
| |
特定星期/日期执行 | 每个星期三中午12:00执行任务 |
|
每月15日上午10:15执行任务 |
| |
每月最后一日上午10:15执行任务 |
| |
每月最后一个星期六上午10:15执行任务 |
| |
每月第三个星期六上午10:15执行任务 |
| |
特定年份的特定日期执行 | 每年3月的每个星期三下午14:10和14:44执行任务 |
|
2022年每天上午10:15执行任务 |
| |
每年每天上午10:15执行任务 |
| |
2022年每天下午14:00到下午14:55、下午18:00到下午18:55时间段内每隔5分钟执行任务 |
| |
2022年至2023年每月第三个星期六上午10:15执行任务 |
| |
2022年至2025年每天上午09:00到下午17:30时间段内每隔半小时执行任务 |
| |
从2022年开始,每隔两年3月的每个星期三下午14:10和14:44执行任务 |
|
四、定时任务调度功能(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. 数据抓取
- 网页抓取:定期抓取特定网站的数据,进行数据分析或存储。