cron
Linux中使用内置cron
计划任务服务,按照约定的时间定时执行特定的任务(job)。cron
服务启动后会读取配置文件/etc/crontab
,cron
服务根据命令和执行时间按时来调用工作任务。
cron
服务操作命令
# 启动计划任务服务
$ service crond start
# 关闭计划任务服务
$ service crond stop
# 重启计划任务服务
$ service crond restart
# 重载计划任务配置
$ service crond reload
cron
服务提供了crontab
命令来设置计划任务
$ crontab [-u user] [-e] [-l] [-r]
参数 | 描述 |
---|---|
crontab -u user | 用于设定用户的定时服务,Linux中每个用户对应着一份crontab任务清单。 |
crontab -e | 编辑用户的crontab文件内容来设置定时任务 |
crontab -l | 显示用户的crontab文件内容 |
crontab -r | 从/var/spool/cron目录中删除用户的crontab 文件 |
crontab -i | 在删除用户crontab时给出确认提示 |
crontab
命令可固定的间隔时间执行指定的系统指令或shell script脚本,时间间隔的单位是分钟、小时、日、月、周即以上的任意组合。
$ crontab -e
当使用crontab
命令编辑完用户的计划任务后,cron
服务自动会在/var/spool/cron
文件夹下生成一个与此用户同名的文件,该文件记录对应用户的计划任务信息,此文件是禁止直接编辑的,只能通过crontab -e
命令来编辑。cron
服务启动后每过1分钟会读取用户配置的计划任务文件,检查是否需要执行里面的命令,因此修改后无需重启cron
服务。
cron
表达式基础语法 - 定时任务时间规则
-
cron
表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每个域代表一个含义。
minute hour day month week command
时间 | 名称 | 取值范围 | 描述 |
---|---|---|---|
minute | 分钟 | 0~59 | 整数 |
hour | 小时 | 0~23 | 整数 |
day | 日期 | 1~31 | 一个月中的某一天 |
month | 月份 | 1~12 | 整数 |
week | 星期几 | 0~7 | 0或7表示星期日 |
command | 命令 | - | - |
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
每个域都可以使用数字,但也可以使用下列特殊字符。
特殊字符 | 名称 | 描述 |
---|---|---|
* | 星号 | 匹配所有可能的值 |
, | 逗号 | 枚举值,使用逗号分隔指定的列表任务。 |
- | 中杠 | 范围,整数之间使用中杠表示一个整数范围。 |
/ | 正斜线 | 增长间隔,指定时间的间隔频率 |
? | 问号 | 仅用于日和星期,可代替* 星号。 |
例如:
表达式 | 分钟 | 小时 | 日期 | 月份 | 星期 | 描述 |
---|---|---|---|---|---|---|
0 6 * * * cmd | 0 | 6 | * | * | * | 每天早上6:00点执行一次任务 |
0 */2 * * * cmd | 0 | */2 | * | * | * | 每间隔2小时执行一次任务 |
*/5 * * * * cmd | */5 | * | * | * | * | 每隔5分钟执行一次任务 |
robfig/cron
robfig/cron
包是Go的定时任务框架,实现了cron
计划任务规范的解析器和任务运行器。不同之处在于robfig/cron
不仅兼容了Linux标准的Crontab格式,而且扩展到秒级。
下载安装包
$ go get -u -v github.com/robfig/cron/v3
例如:
//创建任务调度器实例
c := cron.New()
//注册任务到调度器,注册的任务都是异步执行的。
c.AddFunc("0 30 * * * *", func() {
fmt.Println("every hour on the half hour run...")
})
c.AddFunc("@hourly", func() {
fmt.Println("every hour run...")
})
//启动计划任务
c.Start()
cron.New
-
cron.New()
会根据本地时间创建一个全新且空白的计划任务实例
func New(opts ...Option) *Cron
cron.AddFunc
-
cron.AddFunc()
会向计划任务实例中添加一个回调函数,按指定时间表执行回调函数。 -
cron.AddFunc()
用来注册任务到调度器中,当任务要执行时会使用goroutines调用,这样每个任务都不会发生阻塞。 - 调度器中的任务都会以异步的方式来执行
func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error)
网友评论