linux计划任务(crontab详解)

Linux体系中提供了两种计划任务,一种是只会履行一次的at计划任务,另一种是能够周期性履行的cron计划任务。

在配置和运用at拟定的一次性计划任务之前你需求确保atd服务是正常运行的(Running)!

计划任务的配置是需求在履行at指令并在这以后指定一个时刻点,履行之后就会进入交互形式,在该形式下输入预备履行的指令。完成后运用组合键退出,一起能够运用删去我们输入的内容

到了指定时刻体系会主动履行计划任务中的相关指令,以邮件的形式发给用户,用户再次登录会有新邮件提示,或者运用mail查看邮件。

at-l:查看等候履行的计划任务

at-c3:查看序列为3的计划任务具体内容

at-d1:删去序列为3的计划任务

另外我们也能够运用非交互方法履行计划任务
图片[1]-linux计划任务(crontab详解)-小白之家,crontab详解,linux体系则是由cron(crond)这个体系服务来操控的。Linux体系上面原本就有非常多的计划性作业,因而这个体系服务是默许发动的。另外,因为运用者自己也能够设置计划使命,所以,Linux体系也提供了运用者操控计划使命的指令:crontab指令。

一、crond简介

crond是linux下用来周期性的履行某种使命或等候处理某些事件的一个看护进程,与windows下的计划使命相似,当装置完结操作体系后,默许会装置此服务工具,并且会主动发动crond进程,crond进程每分钟会定期检查是否有要履行的使命,假如有要履行的使命,则主动履行该使命。

Linux下的使命调度分为两类,体系使命调度和用户使命调度。

体系使命调度:体系周期性所要履行的作业,比如写缓存数据到硬盘、日志整理等。在/etc目录下有一个crontab文件,这个便是体系使命调度的配置文件。

/etc/crontab文件包含下面几行:

cat/etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=HOME=/

#run-parts

51****rootrun-parts/etc/cron.hourly

247***rootrun-parts/etc/cron.daily

224**0rootrun-parts/etc/cron.weekly

4241**rootrun-parts/etc/cron.monthly

前四行是用来配置crond使命运转的环境变量,第一行SHELL变量指定了体系要运用哪个shell,这里是bash,第二行PATH变量指定了体系履行指令的途径,第三行MAILTO变量指定了crond的使命履行信息将经过电子邮件发送给root用户,假如MAILTO变量的值为空,则表明不发送使命履行信息给用户,第四行的HOME变量指定了在履行指令或许脚本时运用的主目录。第六至九行表明的意义将在下个小节详细叙述。这里不在多说。

用户使命调度:用户定期要履行的作业,比如用户数据备份、守时邮件提醒等。用户能够运用crontab工具来定制自己的计划使命。一切用户界说的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名共同。

运用者权限文件:

文件:

/etc/cron.deny

阐明:

该文件中所列用户不允许运用crontab指令

文件:

/etc/cron.allow

阐明:

该文件中所列用户允许运用crontab指令

文件:

/var/spool/cron/

阐明:

一切用户crontab文件存放的目录,以用户名命名

crontab文件的意义:

用户所建立的crontab文件中,每一行都代表一项使命,每行的每个字段代表一项设置,它的格局共分为六个字段,前五段是时刻设定段,第六段是要履行的指令段,格局如下:

minutehourdaymonthweekcommand

其间:

minute:表明分钟,能够是从0到59之间的任何整数。

hour:表明小时,能够是从0到23之间的任何整数。

day:表明日期,能够是从1到31之间的任何整数。

month:表明月份,能够是从1到12之间的任何整数。

week:表明星期几,能够是从0到7之间的任何整数,这里的0或7代表周日。

command:要履行的指令,能够是体系指令,也能够是自己编写的脚本文件。

在以上各个字段中,还能够运用以下特别字符:

星号(*):代表一切可能的值,例如month字段假如是星号,则表明在满足其它字段的限制条件后每月都履行该指令操作。

逗号(,):能够用逗号隔开的值指定一个列表规模,例如,“1,2,5,7,8,9”

中杠(-):能够用整数之间的中杠表明一个整数规模,例如“2-6”表明“2,3,4,5,6”

正斜线(/):能够用正斜线指守时刻的距离频率,例如“0-23/2”表明每两小时履行一次。一起正斜线能够和星号一同运用,例如*/10,假如用在minute字段,表明每十分钟履行一次。

二、crond服务

装置crontab:

yuminstallcrontabs

服务操作阐明:

/sbin/servicecrondstart//发动服务

/sbin/servicecrondstop//封闭服务

/sbin/servicecrondrestart//重启服务

/sbin/servicecrondreload//从头载入配置

/sbin/servicecrondstatus//发动服务

检查crontab服务是否已设置为开机发动,履行指令:

ntsysv

参加开机主动发动:

chkconfig–level35crondon

三、crontab指令详解

1.指令格局:

crontab[-uuser]file

crontab[-uuser][-e|-l|-r]

2.指令功用:

经过crontab指令,咱们能够在固定的距离时刻履行指定的体系指令或shellscript脚本。时刻距离的单位能够是分钟、小时、日、月、周及以上的恣意组合。这个指令非常设合周期性的日志分析或数据备份等作业。

3.指令参数:

-uuser:用来设定某个用户的crontab服务,例如,“-uixdba”表明设定ixdba用户的crontab服务,此参数一般有root用户来运转。

file:file是指令文件的姓名,表明将file做为crontab的使命列表文件并载入crontab。假如在指令行中没有指定这个文件,crontab指令将承受规范输入(键盘)上键入的指令,并将它们载入crontab。

-e:修正某个用户的crontab文件内容。假如不指定用户,则表明修正当时用户的crontab文件。

-l:显现某个用户的crontab文件内容,假如不指定用户,则表明显现当时用户的crontab文件内容。

-r:从/var/spool/cron目录中删去某个用户的crontab文件,假如不指定用户,则默许删去当时用户的crontab文件。

-i:在删去用户的crontab文件时给承认提示。

4.常用办法:

1).创立一个新的crontab文件

在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情便是设置环境变量EDITOR。cron进程依据它来确认运用哪个修正器修正crontab文件。99%的UNIX和LINUX用户都运用vi,假如你也是这样,那么你就修正$HOME目录下的.profile文件,在其中参加这样一行:

EDITOR=vi;exportEDITOR

然后保存并退出。无妨创立一个名为cron的文件,其间是用户名,例如,davecron。在该文件中参加如下的内容。

#(putyourowninitialshere)echothedatetotheconsoleevery

#15minutesbetween6pmand6am

0,15,30,4518-06***/bin/echo‘date’>/dev/console

保存并退出。确信前面5个域用空格分隔。

在上面的比如中,体系将每隔15分钟向操控台输出一次当时时刻。假如体系溃散或挂起,从最终所显现的时刻就能够一眼看出体系是什么时刻停止作业的。在有些体系中,用tty1来表明操控台,能够依据实际情况对上面的比如进行相应的修正。为了提交你刚刚创立的crontab文件,能够把这个新创立的文件作为cron指令的参数:

$crontabdavecron

现在该文件现已提交给cron进程,它将每隔15分钟运转一次。

一起,新创立文件的一个副本现已被放在/var/spool/cron目录中,文件名便是用户名(即dave)。

2).列出crontab文件

为了列出crontab文件,能够用:

$crontab-l

0,15,30,45,18-06***/bin/echo`date`>dev/tty1

你将会看到和上面相似的内容。能够运用这种办法在$HOME目录中对crontab文件做一备份:

$crontab-l>$HOME/mycron

这样,一旦不当心误删了crontab文件,能够用上一节所叙述的办法敏捷康复。

3).修正crontab文件

假如期望添加、删去或修正crontab文件中的条目,而EDITOR环境变量又设置为vi,那么就能够用vi来修正crontab文件,相应的指令为:

$crontab-e

能够像运用vi修正其他任何文件那样修正crontab文件并退出。假如修正了某些条目或添加了新的条目,那么在保存该文件时,cron会对其进行必要的完整性检查。假如其间的某个域出现了超出允许规模的值,它会提示你。

咱们在修正crontab文件时,没准会参加新的条目。例如,参加下面的一条:

#DT:deletecorefiles,at3.30amon1,7,14,21,26,26daysofeachmonth

3031,7,14,21,26**/bin/find-name“core’-execrm{}\;

现在保存并退出。最好在crontab文件的每一个条目之上参加一条注释,这样就能够知道它的功用、运转时刻,更为重要的是,知道这是哪位用户的作业。

现在让咱们运用前面讲过的crontab-l指令列出它的全部信息:

$crontab-l

#(crondaveinstalledonTueMay413:07:431999)

#DT:echthedatetotheconsoleevery30minites

0,15,30,4518-06***/bin/echo`date`>/dev/tty1

#DT:deletecorefiles,at3.30amon1,7,14,21,26,26daysofeachmonth

3031,7,14,21,26**/bin/find-name“core’-execrm{}\;

4).删去crontab文件

要删去crontab文件,能够用:

$crontab-r

5).康复丢失的crontab文件

假如不当心误删了crontab文件,假定你在自己的$HOME目录下还有一个备份,那么能够将其复制到/var/spool/cron/,其间是用户名。假如因为权限问题无法完结复制,能够用:

$crontab

其间,是你在$HOME目录中副本的文件名。

我主张你在自己的$HOME目录中保存一个该文件的副本。我就有过相似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这便是为什么有些体系文档主张不要直接修正crontab文件,而是修正该文件的一个副本,然后从头提交新的文件。

有些crontab的变体有些奇怪,所以在运用crontab指令时要格外当心。假如遗漏了任何选项,crontab可能会打开一个空文件,或许看起来像是个空文件。这时敲delete键退出,不要按,否则你将丢失crontab文件。

5.运用实例

实例1:每1分钟履行一次command

指令:

*****command

实例2:每小时的第3和第15分钟履行

指令:

3,15****command

实例3:在上午8点到11点的第3和第15分钟履行

指令:

3,158-11***command

实例4:每隔两天的上午8点到11点的第3和第15分钟履行

指令:

3,158-11*/2**command

实例5:每个星期一的上午8点到11点的第3和第15分钟履行

指令:

3,158-11**1command

实例6:每晚的21:30重启smb

指令:

3021***/etc/init.d/smbrestart

实例7:每月1、10、22日的4:45重启smb

指令:

4541,10,22**/etc/init.d/smbrestart

实例8:每周六、周日的1:10重启smb

指令:

101**6,0/etc/init.d/smbrestart

实例9:每天18:00至23:00之间每隔30分钟重启smb

指令:

0,3018-23***/etc/init.d/smbrestart

实例10:每星期六的晚上11:00pm重启smb

指令:

023**6/etc/init.d/smbrestart

实例11:每一小时重启smb

指令:

**/1***/etc/init.d/smbrestart

实例12:晚上11点到早上7点之间,每隔一小时重启smb

指令:

*23-7/1***/etc/init.d/smbrestart

实例13:每月的4号与每周一到周三的11点重启smb

指令:

0114*mon-wed/etc/init.d/smbrestart

实例14:一月一号的4点重启smb

指令:

041jan*/etc/init.d/smbrestart

实例15:每小时履行/etc/cron.hourly目录内的脚本

指令:

01****rootrun-parts/etc/cron.hourly

阐明:

run-parts这个参数了,假如去掉这个参数的话,后边就能够写要运转的某个脚本名,而不是目录名了

四、运用留意事项

留意环境变量问题

有时咱们创立了一个crontab,可是这个使命却无法主动履行,而手动履行这个使命却没有问题,这种情况一般是因为在crontab文件中没有配置环境变量引起的。

在crontab文件中界说多个调度使命时,需求特别留意的一个问题便是环境变量的设置,因为咱们手动履行某个使命时,是在当时shell环境下进行的,程序当然能找到环境变量,而体系主动履行使命调度时,是不会加载任何环境变量的,因而,就需求在crontab文件中指定使命运转所需的一切环境变量,这样,体系履行使命调度时就没有问题了。

不要假定cron知道所需求的特别环境,它其实并不知道。所以你要保证在shelll脚本中提供一切必要的途径和环境变量,除了一些主动设置的大局变量。所以留意如下3点:

1)脚本中触及文件途径时写大局途径;

2)脚本履行要用到java或其他环境变量时,经过source指令引进环境变量,如:

catstart_cbp.sh

#!/bin/sh

source/etc/profile

exportRUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh-cmev&

3)当手动履行脚本OK,可是crontab死活不履行时。这时有必要斗胆怀疑是环境变量惹的祸,并能够尝试在crontab中直接引进环境变量处理问题。如:

0****./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh

留意整理体系用户的邮件日志

每条使命调度履行完毕,体系都会将使命输出信息经过电子邮件的形式发送给当时体系用户,这样日积月累,日志信息会非常大,可能会影响体系的正常运转,因而,将每条使命进行重定向处理非常重要。

例如,能够在crontab文件中设置如下形式,疏忽日志输出:

0*/3***/usr/local/apache2/apachectlrestart>/dev/null2>&1

“/dev/null2>&1”表明先将规范输出重定向到/dev/null,然后将规范过错重定向到规范输出,因为规范输出现已重定向到了/dev/null,因而规范过错也会重定向到/dev/null,这样日志输出问题就处理了。

体系级使命调度与用户级使命调度

系统级使命调度首要完结体系的一些保护操作,用户级使命调度首要完结用户自界说的一些使命,能够将用户级使命调度放到体系级使命调度来完结(不主张这么做),可是反过来却不可,root用户的使命调度操作能够经过“crontab–uroot–e”来设置,也能够将调度使命直接写入/etc/crontab文件,需求留意的是,假如要界说一个守时重启体系的使命,就有必要将使命放到/etc/crontab文件,即便在root用户下创立一个守时重启体系的使命也是无效的。

其他留意事项

新创立的cronjob,不会马上履行,至少要过2分钟才履行。假如重启cron则马上履行。

当crontab突然失效时,能够尝试/etc/init.d/crondrestart处理问题。或许检查日志看某个job有没有履行/报错tail-f/var/log/cron。

千万别乱运转crontab-r。它从Crontab目录(/var/spool/cron)中删去用户的Crontab文件。删去了该用户的一切crontab都没了。

在crontab中%是有特别意义的,表明换行的意思。假如要用的话有必要进行转义\%,如经常用的date‘+%Y%m%d’在crontab里是不会履行的,应该换成date‘+\%Y\%m\%d’。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发

请登录后发表评论