在linux上定期执⾏命令、脚本(cron,crontab,anacron)
⼈类把时间做了切割,想象⼀条笔直的线永远向前,本来这条直线上什么都没有,但是⼈类根据时间的长短(单位)在这条直线上做了密密⿇⿇的标记(世纪-年-⽉-⽇-时-分-秒-纳秒......),通过这样的⽅式历史上的每⼀个时刻都能够被单独拿出来,⽽未来的每⼀个时刻也能被单独计划。更重要的是,每⼀个单独的时刻⼜能跟相邻的被更⼤单位所控制的相似时刻做⽐较,⽐如,今天的晚上12点跟明天的晚上12点,相似的是,两个时刻都是12点,不同的是今天跟明天,她们是相邻的更⼤单位。因为这样的缘故,在被更⼤单位所隔开的每⼀个相同时刻,我们可以告诉计算机重复某个任务。
在linux下,如果想要在未来的某个时刻执⾏某个任务,并且在未来的每⼀个这样的时刻⾥都要执⾏这个任务,举个简单的例⼦,⽐如说想要在将来,每天的⼗⼆点都重启路由器,⼤多数发⾏版都⾃带⼀个守护进程(daemon)cron来完成这项⼯作。
<,crontab以及anacron的关系
cron是⼤多数linux发⾏版都⾃带的守护进程(daemon),⽤来重复运⾏某些被设定好了确定的运⾏时间的任务,这些任务可以是每个⽉运⾏、每周运⾏、每天运⾏,甚⾄是每⼀分钟运⾏。⽤cron执⾏的任务适合于24⼩时运⾏的机器,cron执⾏的任务会在设定好的时刻执⾏,当机器处于关机状态下并错过了任务执⾏的时间,cron任务就⽆法预期执⾏了。
crontab(cron table的简称)既可以指cron⽤来定期执⾏特定任务所需要的列表⽂件,⼜可以指⽤来创建、删除、查看当前⽤户(或者指定⽤户)的crontab⽂件的命令。
anacron不是守护进程,可以看做是cron守护进程的某种补充程序,anacron是独⽴的linux程序,被cron守护进程或者其他开机脚本启动运⾏,可以每天、每周、每个⽉周期性地执⾏⼀项任务(最⼩单位为天)。适合于可能经常会关机的机器,当机器重新开机anacron程序启动之后,anacron会检查anacron任务是否在合适的周期执⾏了,如果未执⾏则在anacron设定好的延迟时间之后只执⾏⼀次任务,⽽不管任务错过了⼏次周期。举个例⼦,⽐如你设定了⼀个每周备份⽂件的任务,但是你的电脑因为你外出度假⽽处于关机状态四周,当你回到家中开机后,anacron会在延迟⼀定时间之后只备份⼀次⽂件。由于发⾏版的不同,cron守护进程如何运⾏anacron会有所不同。
系统默认crontab⽂件为/etc/crontab,以及/etc/cron.d/⽬录下的⽂件,有些程序会把⾃⼰的crontab⽂件放在/etc/cron.d/⽬录下。要修改/etc/crontab以及/etc/cron.d/⽬录下的⽂件需要root权限。cron守护进程会检查/etc/crontab以及/etc/cron.d/⽬录下的⽂件,根据这些⽂件中的cron任务所设置的执⾏时间决定是否执⾏任务,如果当前时间与cron任务所设置的执⾏时间相同,则执⾏任务。
每个⽤户⾃⼰的crontab⽂件都会被放在 /var/spool/cron⽬录下,默认为空,可以使⽤crontab命令创建。
cron守护进程会检
查/var/spool/cron⽬录下的⽂件,根据这些⽂件中的cron任务所设置的执⾏时间决定是否执⾏任务,如果当前时间与cron任务所设置的执⾏时间相同,则执⾏任务。
当cron的配置⽂件发⽣改变时,不需要重置cron守护进程。cron守护进程会检查配置⽂件的变化。
创建⾃⼰的crontab之前,⾸先要设置环境变量EDITOR,cron进程根据它来确定使⽤哪个编辑器编辑crontab⽂件。在home⽬录下的.bashrc或者.profile⾥加⼊⼀⾏
#你也可以使⽤⾃⼰喜爱的其他终端编辑器
EDITOR=vim; export EDITOR
ab命令参数及使⽤⽰例
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
创建并编辑当前⽤户的crontab
crontab -e
列出当前⽤户的crontab
crontab -l
删除⽤户linus的crontab
crontab -u linus -i -r
ab⽂件语法详解及⽰例
当⽤ crontab -e 编辑当前⽤户的crontab⽂件时,⾸先写⼊以下内容。
# crontab -e
SHELL=/bin/bash
MAILTO=root@example
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# For details see man 4 crontabs
# Example of job definition:
# .---------------- 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,satlinux循环执行命令脚本
# | | | | |
# * * * * * user-name command to be executed
该⽂件的前三⾏代码设置了默认环境。cron守护进程并不提供任何环境。SHELL变量设置当cron任务(命令以及脚本)运⾏时的shell,MAILTO变量设置cron任务执⾏结果发送的邮箱,PATH设置去哪些⽬录下寻cron任务的命令。注释部分则解释⼀条cron任务的构成,⼀条cron任务就是⼀⾏,要设置多少条cron任务则写多少⾏。⼀条cron任务由七个部分组成,从左到右依次为:
分钟(0-59)
⼩时(0-23)
天(1-31)
⽉(1-12):或者可以使⽤⽉份的英⽂单词的前三个字母,⽐如jan,feb,
星期(0-6):星期天⽤0或者7都可以,或者可以使⽤星期的英⽂单词的前三个字母,⽐如sun,mon,tue,wed,thu,fri,sat ⽤户名称(可以省略)
要执⾏的命令或者脚本⽬录
前五个部分的编写注意特殊符号的含义:
如果你想匹配取值范围内的所有值,使⽤“*”
想匹配某些特殊的值,使⽤“,”,⽐如2,4,7就匹配的是2,4以及7。
两个值被“-”连接表⽰范围,此时匹配的是范围内所有值,包含“-”两边的值,⽐如4-7匹配的就是从4到7。
想要表达每隔⼀段时间执⾏⼀次任务,使⽤ “/”,⽐如分钟部分中的 “*/10”表⽰每10分钟运⾏⼀次,⽐如⼩时部分中的“10-22/2”则表⽰在早上10点到晚上10点这段时间内,每隔两个⼩时运⾏⼀次。注意:当“/”左边的值可以除尽“/”右边的值时,任务才会运⾏。
例⼦1:
每天凌晨执⾏
0 0 * * * root command
例⼦2:
每周星期天早上五点执⾏
0 5 * * sun root command
例⼦3:
每个⽉的前10天晚上10点开始每隔10分钟执⾏⼀次命令
*/10 22 1-10 * * root command
例⼦4:
从星期⼀到五,每个⼩时的第10分钟、第20分钟以及第30分钟都执⾏⼀次命令
10,20,30 * * * 1-5 root command
例⼦5:
从早上10点到晚上10点,每个偶数的⼩时(⽐如10点,12点)⾥每五分钟运⾏⼀次命令
*/5 10-22/2 * * * root command
特殊简便写法:
@hourly 代表 0 * * * * ,每个⼩时运⾏⼀次
@daily 代表 0 0 * * * ,每天凌晨运⾏⼀次
@weekly 代表 0 0 * * 0 ,每周星期天凌晨运⾏⼀次
@monthly 代表 0 0 1 * * ,每个⽉第⼀天凌晨运⾏⼀次
@yearly 代表 0 0 1 1 * ,每年的头⼀分钟运⾏⼀次
@reboot 重启后执⾏⼀次
例⼦:
每天凌晨运⾏⼀次
@daily command
你可以把需要每个⼩时运⾏⼀次的脚本放到/etc/cron.hourly⽬录下,cron守护进程会每个⼩时都运⾏⼀次。
2.3.限制可以使⽤cron的⽤户
在/etc/⽬录下,可能默认会有cron.allow以及cron.deny⽂件,也可能没有,没有的情况下可以⾃⼰创建,cron.allow⽂件包含了可以使⽤cron的⽤户名,cron.deny⽂件包含了不可以使⽤cron的⽤户名。两个⽂件中每个⽤户名占⼀⾏,并且不允许出现空格。
root⽤户在任何情况下都可以使⽤cron。
假如cron.allow存在,则只有列在这个⽂件中的⽤户名可以使⽤cron,这时候cron.deny被忽视。
假如cron.allow不存在,则列在cron.deny⽂件中的⽤户名不可以使⽤cron。
3.⽤anacron执⾏周期性的任务
anacron程序可以周期性的执⾏任务,但具体执⾏时间并不确定。可以每天、每周、每个⽉周期性的执⾏任务。当anacron的配置⽂件发⽣改变时,下⼀次anacron运⾏时会检查到配置⽂件的变化。anacron的配置⽂件为/etc/anacrontab,编辑需要root权限,默认以下内容:
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1  5  cron.daily    nice run-parts /etc/cron.daily
7  25  cron.weekly    nice run-parts /etc/cron.weekly
@monthly 45  hly  nice run-parts /hly
可以看到前三⾏设置了默认环境,RANDOM_DELAY变量设置了最⼤延迟执⾏时间,START_HOURS
_RANGE变量设置了anacron任务执⾏的时间范围,默认在每天的3点到22点之间。最后三⾏则设置了三条默认的anacron任务,分别是每天执⾏,每周执⾏,每⽉执⾏。
3.1.anacron⽂件语法
观察前⾯三条默认的anacron任务,可以看到⼀条anacron任务分为四个部分,从左到右依次为:
周期(天):设置任务执⾏的频率,以天数为单位,写1则代表每天执⾏,写3则代表每3天执⾏,可以使⽤特殊符号“@”, @daily 代表每天, @weekly 代表每周, @monthly 代表每⽉。
延迟时间:设置任务的延迟时间,以分钟为单位,⽐如写5,则当anacron启动后,anacron等待5分钟就会执⾏该任务。设置延迟时间是为了当机器启动时不会因为执⾏很多anacron任务⽽过载。
任务标识:其⽬的是识别消息,⽇志⽂件和执⾏特殊操作。
要执⾏的命令
在/etc/anacrontab中的三条默认anacron任务中,nice命令⽤来调整后⾯命令的优先级,run-parts命令⽤来执⾏设置的⽬录下的所有脚本,就是说这三条任务分别每天,每周,每⽉执⾏/etc/cron.daily,/etc/cron.weekly,/hly⽬录下的脚
本。所以我们不⽤⾃⼰往/etc/anacrontab中添加anacrontab任务,⽽只需把脚本放到相应的⽬录下,anacron就会周期性的执⾏这些脚本了。
3.2.anacron如何运⾏
既然anacron不是守护进程,那它是如何做到周期性执⾏任务的呢?在centos7下,cron会运⾏/etc/cron.d/0hourly,
在/etc/cron.d/0hourly⽂件⾥,有⼀条cron任务是这样的:
01 * * * * root run-parts /etc/cron.hourly
这条cron任务会运⾏/etc/cron.hourly⽬录下的所有脚本,其中有⼀个名为 0anacron 的脚本,该脚本则会在合适的时间运⾏anacron,anacron则会检查/etc/anacrontab,在合适的时间分别运⾏/etc/cron.daily,/etc/cron.weekly,/hly⽬录下的脚本。
参考资料:
总结
以上所述是⼩编给⼤家介绍的在linux上定期执⾏命令、脚本(cron,crontab,anacron),希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。