详解Unix/Linux中周期执行指令Crontab命令
简介
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。
通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cronjobs。
cron是Unix/Linux中提供定期执行shell命令的服务,包括crond和crontab两部分:
crond:cron服务的守护进程,常驻内存负责定期调度
crontab:cron的管理工具,负责编辑调度计划
下面的演示在Ubuntu16.04下进行。基本的使用方法可以用命令mancrontab查看
NAME crontab-maintaincrontabfilesforindividualusers(VixieCron) SYNOPSIS crontab[-uuser]file crontab[-uuser][-i]{-e|-l|-r}
简单解释一下
-e编辑,类似vim,保存退出时会检查语法
-l列举所有任务
-r删除所有任务
如果crontab运行出错,可以查看日志文件/var/log/syslog
基本语法
cron的语法非常简单,一共分六大块,其中前五块用于指定时间周期,最后一块是具体执行的命令,看起来大概是这么个格式:
minhourdaymonthweekcommand
其中
min表示分钟,范围0-59
hour表示小时,范围0-23
day表示天,范围1-31
可以填写L,表示当月最后一天
可以填写W,1W表示离1号最近的工作日
month表示月,范围1-12
每个月的最后一天crontab本身是不支持的,需要通过脚本判断
week表示周,范围0-7
这里0和7都表示周日
周与日月不能并存,可能会冲突
可以填写#,4#3表示当月第三个星期四
可以填写L,5L表示当月最后一个星期五
command表示具体要执行的命令(最好是绝对路径)
如果有多条命令,则需要用&连接,或者将多条命令写在shell脚本中,然后crontab定期执行这个shell脚本即可
另外,类似正则表达式,还有一些特殊符号帮助我们实现灵活调度
*星号,表示每个可能的值都接受
例如*****command表示每分钟都执行command一次
,逗号,并列时间
例如*6,12,18***command表示在6点、12点和18点执行command一次
-减号,连续区间
例如*9-17***command表示从9点到17点,每分钟都执行command一次
/斜线,间隔单位
例如*/5****command表示每隔5分钟执行command一次
系统级Crontab
如果我们需要执行一些权限较高的指令,就需要利用root权限来执行,这时的机制和前面介绍的基本语法也是有区别的,我们需要编辑的文件是/etc/crontab。先来看看其内容
dawang@dawang-Parallels-Virtual-Platform:~$cat/etc/crontab #/etc/crontab:system-widecrontab #Unlikeanyothercrontabyoudon'thavetorunthe`crontab' #commandtoinstallthenewversionwhenyoueditthisfile #andfilesin/etc/cron.d.Thesefilesalsohaveusernamefields, #thatnoneoftheothercrontabsdo. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin #mhdommondowusercommand 17****rootcd/&&run-parts--report/etc/cron.hourly 256***roottest-x/usr/sbin/anacron||(cd/&&run-parts--report/etc/cron.daily) 476**7roottest-x/usr/sbin/anacron||(cd/&&run-parts--report/etc/cron.weekly) 5261**roottest-x/usr/sbin/anacron||(cd/&&run-parts--report/etc/cron.monthly) #
我们需要在命令和时间间隔之间添加命令执行者,并且也可以添加环境变量在调度中使用。我们看到配置文件中有几个cron.*文件,先来看看还有什么类似的文件
dawang@dawang-Parallels-Virtual-Platform:~$ll/etc|grepcron -rw-r--r--1rootroot40112月292014anacrontab drwxr-xr-x2rootroot40964月2106:14cron.d/ drwxr-xr-x2rootroot40964月2106:14cron.daily/ drwxr-xr-x2rootroot40964月2106:08cron.hourly/ drwxr-xr-x2rootroot40964月2106:14cron.monthly/ -rw-r--r--1rootroot7224月605:59crontab drwxr-xr-x2rootroot40964月2106:14cron.weekly/
其中
cron.d目录:该目录下及子目录中所有符合调度语法的文件都会被执行
cron.deny:记录拒绝执行的用户
cron.allow:记录允许执行的用户,这个文件的优先级较高,一般来说只需要配置一个文件即可(看是需要白名单还是黑名单机制)
cron.daily/hourly/monthly/weekly目录:里面都是脚本,分别在指定的时间里执行
更多详细介绍,可以输入man5crontab或man8cron查阅
原理
为什么我们用crontab-e编辑一下就可以添加一个定时任务呢?每次我们添加一行,这个工作就会被记录到/var/spool/cron/crontab中,如果我的用户名是dawang,那么对应的文件就是/var/spool/cron/crontab/dawang(需要root权限才能查看)。不过不建议直接修改,因为直接修改是不会进行语法检查的。
在某些系统中,不一定会每次都读取源配置文件(而是利用载入到内存的版本),这个时候我们就需要重启crond服务,命令为/sbin/servicecrondrestart
Crond服务管理
默认情况系统并没有为我们启动crond服务,如果想开机启动,需要在/etc/rc.d/rc.local中添加servicecrondstart这一行,其他的管理命令为
#启动服务 /sbin/servicecrondstart #关闭服务 /sbin/servicecrondstop #重启服务 /sbin/servicecrondrestart #重新载入配置 /sbin/servicecrondreload
实例测试
接着我们来实战一下,第一次使用crontab-e需要我们选择编辑器,默认是nano,但是我选择了vim
dawang@dawang-Parallels-Virtual-Platform:~$crontab-e nocrontabfordawang-usinganemptyone Selectaneditor.Tochangelater,run'select-editor'. 1./bin/ed 2./bin/nano<----easiest 3./usr/bin/vim.tiny Choose1-3[2]:
为了验证真的在执行,我们建立两个每分钟都执行的操作,具体如下(主要关注最后两行):
#Editthisfiletointroducetaskstoberunbycron. # #Eachtasktorunhastobedefinedthroughasingleline #indicatingwithdifferentfieldswhenthetaskwillberun #andwhatcommandtorunforthetask # #Todefinethetimeyoucanprovideconcretevaluesfor #minute(m),hour(h),dayofmonth(dom),month(mon), #anddayofweek(dow)oruse'*'inthesefields(for'any').# #Noticethattaskswillbestartedbasedonthecron'ssystem #daemon'snotionoftimeandtimezones. # #Outputofthecrontabjobs(includingerrors)issentthrough #emailtotheuserthecrontabfilebelongsto(unlessredirected). # #Forexample,youcanrunabackupofallyouruseraccounts #at5a.meveryweekwith: #05**1tar-zcf/var/backups/home.tgz/home/ # #Formoreinformationseethemanualpagesofcrontab(5)andcron(8) # #mhdommondowcommand *****date>>/home/dawang/date.txt *****echo"timetogo!">>/home/dawang/time.txt
这里做了两件事,一个是每分钟报时,另一个就是每分钟输出一段话,这里使用>>表示追加输出,更多输入输出方式在下一节有介绍。如果刚才没有启动服务,现在用servicecrondstart启动,然后等待一段时间,就可以看到输出啦,具体参考下面的命令,这里就不赘述了:
dawang@dawang-Parallels-Virtual-Platform:~$ll|greptxt -rw-rw-r--1dawangdawang18497月2616:08date.txt -rw-rw-r--1dawangdawang5167月2616:08time.txt dawang@dawang-Parallels-Virtual-Platform:~$tail-n10date.txt 2016年07月26日星期二16:01:01CST 2016年07月26日星期二16:02:01CST 2016年07月26日星期二16:03:01CST 2016年07月26日星期二16:04:01CST 2016年07月26日星期二16:05:01CST 2016年07月26日星期二16:06:01CST 2016年07月26日星期二16:07:01CST 2016年07月26日星期二16:08:01CST 2016年07月26日星期二16:09:01CST 2016年07月26日星期二16:10:01CST dawang@dawang-Parallels-Virtual-Platform:~$tail-n10time.txt timetogo! timetogo! timetogo! timetogo! timetogo! timetogo! timetogo! timetogo! timetogo! timetogo!
重定向命令
这里直接给出例子
command>file把标准输出重定向到文件 command>>file把标准输出追加到文件 command1>file把标准输出重定向到文件 command2>file把标准错误重定向到文件 command2>>file把标准输出追加到文件 command2>&1把command命令标准错误重定向到标准输出 command>file2>&1把标准输出和标准错误一起重定向到文件 command>>file2>&1把标准输出和标准错误一起追加到文件 command<file把command命令以file文件作为标准输入 command<file>file2把command命令以file文件作为标准输入,以file2文件作为标准输出 command<&-关闭标准输入
总结
以上就是这篇文章的全部内容了,希望对大家的学习或者工作能带来一定的帮助。