shell之定时周期性执行脚本的方法示例
示例
1.编写测试脚本脚本time.sh
$cattime.sh #!/bin/bash echo$(date+%s)>>/home/ocean/out.txt
保存完毕后记得给予权限chmod777test.sh
2.添加定时任务
$crontab-e nocrontabforocean-usinganemptyone Selectaneditor.Tochangelater,run'select-editor'. 1./bin/nano<----easiest 2./usr/bin/vim.tiny 3./bin/ed
内容编辑为:每一分钟执行一次
#mhdommondowcommand *****/home/ocean/workspaces/shell/time.sh
3.查看定时任务是否添加成功
$crontab-l
4.重启cron:新加入的定时任务不会马上执行,一般要等一会儿,除非你重启服务器
$sudoservicecronrestart
注意,新创建的cron作业,不会马上执行,至少要过2分钟才执行。如果重启cron服务则会马上执行。
5.查看执行结果
$catout.txt
1552543807
1552543861
1552543921
1552543981
1552544041
1552544101
原理
ubuntu默认安装了cron,是开机自启动的。
当cron启动后,它会读取它的所有配置文件,然后cron会根据命令和执行时间来调度工作任务。
cron有两个配置文件,一个是一个全局配置文件(/etc/crontab),是针对系统任务的;一组是crontab命令生成的配置文件(/var/spool/cron下的文件),是针对某个用户的.定时任务配置到任意一个中都可以。
每个用户的计划任务配置文件
$ls-l/var/spool/cron/ total4 drwx-wx--T2rootcrontab4096Nov162017crontabs
备注:这个歌目录下只会有一个crontabs,就算新添加其他计划,也只会有一个。
全局性配置文件
$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)
ununtu通过调用run-parts命令,定时运行四个目录下的所有脚本。
1)/etc/cron.hourly,目录下的脚本会每个小时让执行一次,在每小时的17分钟时运行;
2)/etc/cron.daily,目录下的脚本会每天让执行一次,在每天的6点25分时运行;
3)/etc/cron.weekly,目录下的脚本会每周让执行一次,在每周第七天的6点47分时运行;
4)/etc/cron.mouthly,目录下的脚本会每月让执行一次,在每月1号的6点52分时运行;
当然,以上的时间均是系统默认时间,可以根据自己的需求进行修改。
corn程序会在后台运行并且检查cron时间表,以获知已安排执行的主页。
开启关闭cron
命令 | 作用 |
---|---|
sudoservicecronstatus | 查看cron状态 |
sudo/etc/init.d/cronstart | 启动cron |
sudo/etc/init.d/cronstop | 关闭cron |
sudo/etc/init.d/cronrestart | 重启cron |
cron时间表
为cron时间表添加条目,其格式为
minhourdayofmonthmonthdayofweekcommand
分布代表分时天月星期几数值范围分别是0-59:0-23:1-31:1-12:0-7
记住几个特殊符号的含义:
- 星号(*):代表所有可能的值,举个例子,在小时字段中,一个星号等同于每个小时;在月份字段中,一个星号则等同于每月。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
corn时间表例子:
- *****test.sh每分钟执行一次test.sh
- */5****test.sh每5分钟执行一次test.sh
- 0*/2***test.sh>out每两小时执行一次test.sh并将结果存入out中
- 0000***/home/rich/test.sh每天的凌晨0:0分执行
- 3021***/home/rich/test.sh每天的21:30分执行
- 1516**1command每周一16:15运行命令
- 00121**command每个月的1号的中午12:00点执行命令
- 008***if[date+%d-dtomorrow=01];then;command每个月的最后一天8点执行命令
可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0为周日,6为周六)
来指定dayofweek表项。
cron目录
如果脚本对精确的执行时间要求不高,用预配置的cron脚本更方便
$ls/etc/cron.*ly /etc/cron.daily: 0anacronapt-compatcracklib-runtimelogrotatemlocatepopularity-contestupdate-notifier-common apportbsdmainutilsdpkgman-dbpasswdubuntu-advantage-tools /etc/cron.hourly: /etc/cron.monthly: 0anacron /etc/cron.weekly: 0anacronman-dbupdate-notifier-common
比如,如果脚本每天运行一次,只要将脚本复制到daily目录,cron就会每天执行它【根据/etc/crontab下配置的时间】
anacron
缺点:cron可以执行一些定时任务,但是如果这个时间点来了,但是此时linux系统正在关机中,那么这个定时任务不能执行。即使系统再次开机,cron也不会去执行哪些已经错过了的程序。
解决:anacron,开机时会自动运行关机期间的作业。前提是这个程序位于cron目录之下。
应用场景:anacron用于以天为单位的频率运行命令。它的工作与cron最大的不同在于,它假设机器不会一直开机。
anacron工作原理
anacron的任务被列在/etc/anacrontab
sudocat/etc/anacrontab [sudo]passwordforocean: #/etc/anacrontab:configurationfileforanacron #Seeanacron(8)andanacrontab(5)fordetails. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root #Thesereplacecron'sentries 15cron.dailyrun-parts--report/etc/cron.daily 710cron.weeklyrun-parts--report/etc/cron.weekly @monthly15cron.monthlyrun-parts--report/etc/cron.monthly
ununtu通过调用run-parts命令,定时运行3个目录下的所有脚本。
从上面可以看出,anacron的运行频率的最小时间是天。【cron是分钟】
$ls-l/var/spool/anacron/ total12 -rw-------1rootroot9Jun110:25cron.daily -rw-------1rootroot9May2711:01cron.monthly -rw-------1rootroot9May3010:28cron.weekly
anacron程序使用自己的时间表来检查工作目录
时间表格式
perioddelayidentifiercommand
- period-这是任务的频率,以天来指定,或者是@daily、@weekly、@monthly代表每天、每周、每月一次。你也可以使用数字:1-每天、7-每周、30-每月,或者N-几天。anacron程序用此条目来检查作业的时间戳文件
- delay-这是在执行一个任务前等待的分钟数。
- identifier-条目是一种特别的非空字符串,如cron-weekly。它用于唯一标识日志消息和错误邮件中的作业。
- command-这是要执行的命令或shell脚本。
anacron会检查任务是否已经在period字段执行的时间被执行了,如果没有,则等待delay字段中指定的分钟数后,执行command字段中指定的命令。
一旦任务被执行,它会使用job-id(时间戳文件名)字段中指定的名称将日期记录在/var/spool/anacron目录中的时间戳文件中。
cronVSanacron
cron是linux自带的守护进程,用来重复运行哪些被设定好了确定的运行时间的任务,如果机器处于关机状态并错过了任务执行时间,这个任务就无法执行了
crontab(crontable的简称)既可以指cron用来定期执行特定任务所需要的列表文件,又可以指用来创建、删除、查看当前用户(或者指定用户)的crontab文件的命令。
anacron不是守护进程,可以看做是cron守护进程的某种补充程序,anacron是独立的linux程序,被cron守护进程或者其他开机脚本启动运行,可以每天、每周、每个月周期性地执行一项任务(最小单位为天)。适合于可能经常会关机的机器,当机器重新开机anacron程序启动之后,anacron会检查anacron任务是否在合适的周期执行了,如果未执行则在anacron设定好的延迟时间之后只执行一次任务,而不管任务错过了几次周期。举个例子,比如你设定了一个每周备份文件的任务,但是你的电脑因为你外出度假而处于关机状态四周,当你回到家中开机后,anacron会在延迟一定时间之后只备份一次文件。由于发行版的不同,cron守护进程如何运行anacron会有所不同。
cron | anacron |
---|---|
它是守护进程 | 它不是守护进程 |
适合服务器适合桌面/笔记本电脑 | |
可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
关机时不会执行计划任务 | 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务 |
普通用户和root用户都可以使用 | 只有root用户可以使用(使用特定的配置启动普通任务) |
cron和anacron主要的区别在于cron能在那些持续运行的机器上有效地运行,而anacron是针对那些会在一天内或者一周内会关机的机器。
参考:
https://blog.csdn.net/qq_32693119/article/details/79816097
https://www.cnblogs.com/daxian2012/articles/2589894.html
https://www.cnblogs.com/zhoul/p/9931664.html
https://www.linuxprobe.com/cron-anacron-work.html
到此这篇关于shell之定时周期性执行脚本的方法示例的文章就介绍到这了,更多相关shell定时周期性执行脚本内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。