无论是生活还是工作,我们都是按照自己的计划或者备忘录进行做事情的,比如你计划晚上看一场球赛,非常兴奋的等待着,但是因为今天太困了你没有看到,只能等待第二天才能看重播。那么有没有一种可能,设计个定时任务提前把球赛录制下来,等到第二天再去看呢?
其实在计算机设计中,这种方法叫做定时任务,定时任务常用场景有两个,一个是服务器使用的,它是7*24不间断执行的,另一个是我们普通电脑使用的,开机后再去执行晚上因关机或者停电未执行的任务,今天我们就一起学习下定时任务这一内容吧。
Linux中的定时任务crontab
在Linux服务器中,定时任务是非常有必要的,因为有很多场景使用它,比如每天凌晨一点把未支付的订单作废或者过了十二点把未完成的保修单给废除掉。这些都是定时任务来完成的,当然通过程序也可以实现,但是Linux已经把contab做的非常完善了,没必要再去做这种无用功,应该站在巨人的肩膀上去看待这个世界。
Contab通常需要载入到配置文件中才能生效,接下来就让我们看下如何使用它,更快的了解如何使用它,最简单的方法是通过`crontab -h`就可以列出来他有哪些命令了,如果你在shell中输入了`crontab -h`就会显示如下图的内容。
上图是具体的操作命令和解释,接下来就解释下crontab命令的构成,crontab的命令构成为时间+动作,其时间有分、时、日、月、周五种,操作符有
* 取值范围内的所有数字/ 每过多少个数字-从X到Z,散列数字每1分钟执行一次`hello,world`输出到out日志文件中* * * * * echo "Hello,World" > ~/out.log # 每1分钟执行一次`hello,world`输出到out日志文件中每小时的第3和第15分钟执行一次`hello,world`输出到out日志文件中3,15 * * * * echo "Hello,World" > ~/out.log # 每小时的第3和第15分钟执行一次`hello,world`输出到out日志文件中每晚的21:30执行一次`hello,world`输出到out日志文件中30 21 * * * echo "Hello,World" > ~/out.log # 每晚的21:30执行一次`hello,world`输出到out日志文件中如果看到这里你对定时任务也有了一定的了解,可以在闲暇时光,尝试着做些小项目玩玩。通常服务器都是7*24小时不间断运行的,如果断电了定时任务还能执行吗?这个问题其实也是crontab没有考虑到的问题,如果有意外事件产生定时任务是不能被执行的,要想执行任务就要学习另一种定时任务了。
anacron
Anacron 是用来做什么的呢?设想这样一个场景,Linux 服务器会在周末关机两天,但是设定的定时任务大多在周日早上进行,但在这个时间点,服务器又处于关机状态,导致系统很多定时任务无法运行。
Anacron 会以 1 天、1周(7天)、一个月作为检测周期,判断是否有定时任务在关机之后没有执行。如果有这样的任务,那么 anacron 会在特定的时间重新执行这些定时任务。
那么,anacron 是如何判断这些定时任务已经超过执行时间的呢?这就需要借助 anacron 读取的时间记录文件。anacron 会分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,将两者进行比较,如果两个时间的差值超过 anacron 的指定时间差值(一般是 1 天、7 天和一个月),就说明有定时任务没有执行,这时 anacron 会介入并执行这个漏掉的定时任务,从而保证在关机时没有执行的定时任务不会被漏掉。
anacron 如何在 Linux 工作
Anacron 任务被列在 /etc/anacrontab 中,任务可以使用下面的格式(anacron 文件中的注释必须以 # 号开始)安排。
period delay job-identifier commandperiod - 这是任务的频率,以天来指定,或者是 @daily、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用数字:1 - 每天、7 - 每周、30 - 每月,或者 N - 几天。delay - 这是在执行一个任务前等待的分钟数。job-id - 这是写在日志文件中任务的独特名字。command - 这是要执行的命令或 shell 脚本。现在让我们看一个例子。这个会每天运行 `~/backup.sh `脚本:
@daily 10 example.daily /bin/bash ~/backup.sh当机器在 backup.sh 期望被运行时是关机的,anacron 会在机器开机十分钟之后运行它,而不用再等待 7 天。
这里有两个你应该理解的 anacrontab 文件的重要变量:
START_HOURS_RANGE - 这个设置任务开始运行的时间范围(也就是任务只在这几个小时内运行)。RANDOM_DELAY - 这定义添加到用户定义的任务延迟的最大随机延迟(默认为 45)。这是你的 anacrontab 文件可能看上去的样子。
这是 cron 以及 anacron 的比较,帮助你理解何时用他们其中一个。
Cron 和 anacron 主要的区别在于 cron 能在那些持续运行的机器上有效地运行,而 anacron 是针对那些会在一天内或者一周内会关机的机器。