Linux之任务计划 crontab

Linux之任务计划 

 

用过windows的同学应该都知道在控制面板中有一个“任务计划”选项,我们可以通过向导设置让计算机在某个时间点或者开机时运行某个脚本或者批处理等等,方便我们的日常管理监视工作;同样在Linux系统中,如果我们想在开机时就运行某个操作,可以直接将命令写入/etc/rc.local中,该操作就会在机器开机时运行;如果把自己写的Bash Shell脚本的名称写在/etc/rc.local中,开机后也会执行其操作;也就是说,在Linux启动的最后阶段,系统会执行存于rc.local中的命令;类似于windows里面的“启动”菜单。如果想在Linux中定时去执行某些操作呢?我们可以使用at ,batch ,crontab , anacron等命令;

一、一次性执行任务命令atbatch

说白了就是任务只执行一次,就结束操作,不会循环执行其操作。

  1. 使用方式:at [-v][-q queue][-f file][-mldbv] TIME

    说明:at可以让使用者指定在TIME这个特定时刻执行某个程序或指令,TIME的格式是HH:MM其中HH为小时,MM为分钟。如果想要指定超过一年内的时间,则可以使用MMDDYY或者MM/DD/YY的格式,其中MM是分钟,DD是第几天,YY是指年份。另外,也可以使用想now+时间间隔来指定时间,其中的时间间隔可以为minutes ,hours ,days ,weeks.例如now+3days;也可以指定todaytomorrow来表示今天或明天。当指定了时间并按下enter之后,at会进入交互模式并要求输入指令或程序,当输入完成后按ctrl+D即可完成。执行结果会通过邮件发送给执行程序的账户。

  2. 参数说明

    -V :出版编号

    -q:使用指定queue来存储,at的资料存放在所谓的queue中,使用者可以同时使用多个queue,queue的编号为a,b,c…..z以及A,B,C……Z52个;

    -m:不管程序指令执行完后有没有输出结果,都发邮件给使用者

    -f file:读入预先写好的命令文档。可以将所有的命令先写入文档在一次读入;

    -l:列出所有at任务;或者atq;

    -d:删除at任务,或者使用atrm;  

    -v:列出所有已经完成但尚未删除的指定;

3、实例:指定今天下午5:30执行某个命令,今天是2015517日中午12点其格式如下:

       at 5:30pm

       at 17:30

       at  17:30 today

       at now + 5 hours

       at now + 300 minutes

       at 17:30 17.5.15

       at 17:30 5/17/2015

       at 17:30 May 17

      实例2at指定一个任务,在当前时间一分钟后执行,显示/etc/issue中的内容;1.png

实例3:先创建一个文档work,放入预先执行的命令,然后用at –f work TIME去执行;2.png

  1. at的执行权限:

    在任何情况下,root用户都有执行权限;

    对其他用户来说,是否能够使用取决于两个文档/etc/at.allow/etc/at.deny

    如果/etc/at.allow文档存在的话,那么只有在其中列出的用户在能够使用at

    如果该文档不存在,那么将检查/etc/at.deny文档是否存在,在这个文档中列出的用户均不能使用该命令;

    假如两个文档都不存在,那么只有中级用户能够使用该命令;

    空的/etc/at.deny文档意味着所有的用户都能够使用该命令,这是系统默认状态.

  2. batch命令同at命令,但无须为其指定时间,其会选择系统资源空闲时执行指定的作业。

  3. mail命令(Linux收发邮件使用方法)

    在终端中输入命令mail,回车,如果有邮件会显示出来有几封,如果没有会提示no mail for user;输入mail后进入&模式,此时可以输入想要查看的邮件编号数字来查看内容,如果想要删除某个邮件可以使用d #命令,按q保存退出,按x不保存退出;

    两种发邮件的方法:

           mail –s “subject” username </etc/fstab

           echo “subject”  | mail –s “content”  username

    默认系统会安装并启动邮件服务;25号端口,可以使用netstat –tnl /tan   查看25号端口smtp协议是否运行 ;有的系统可能默认没有安装邮件系统,此时需要安装sendmial包即可;

二、周期性执行任务命令crontab(重点)

相比用于安排一次性任务的at命令,crontab命令主要是用于安排一些周期性的任务,比如 定期备份数据、定时杀毒、定期清理垃圾文件等。 Linux中的cron进程是一个主要的系统调度进程,可以在后台自动完成用户指定的任务 计划。它每分钟检查一遍各个用户的“”任务计划书“”--也就是crontab文件,如果计划书中所指定的运行条件满足,就立即为用户执行计划书中的任务。centos5以前的版本叫做vixie-cron,centos6以后的版本叫作cronie,在运行前使用rpm –qa | grep “cron” 来查看系统是否已经安装;可以通过service crond status查看状态,service crond start ,chkconfig crond on 启动服务,设置开机自动启动;

Cron任务分两类:一类是系统cron:定义在/etc/crontab中,一类是用户cron:定义在/var/spool/cron中,目录中每个用户都有一个与用户名相同的文件,其功能类似于/etc/crontab;每行定义一个独立的任务;

  1. crontab命令使用方法

    crontab [-e [username] | -l [username] | -r [username] | -v [username] | File ]

    说明:crontab是用来让使用者在固定时间或固定间隔执行程序之用,换句话说就是类似使用者的时程表。

    -u username 是指定username的时程表,这个前提是你必须要有其权限,比如root才能够指定他人的时程表,如果不使用-u user的话,就是表示设定自己的时程表。

    Crontab –l:列出某个用户cron服务的详细内容

    Crontab –e:编辑某个用户的cron服务;

  2. crontab的格式

    # 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,sat

    # |  |  |  |  |

    # *  *  *  *  *  command to be executed

    说明:当使用crontab -e编辑当前用户的cron表后,会出现一个vi文件,cron的格式是这样的。分成两列,左边是时间,右边是运行的命令。时间是由5个部分组成。如果执行的命令太多,可以把这些命令写到一个脚本里面,然后再直接调用这个脚本,调用的时候写出命令的完整路径。

    时间的设定有一定的要求,前面5*代表5个数字,数字的取值范围和含义如下:

    分钟(0-59)小时(0-23)日期(1-31)月份(1-12)星期(0-607都表示星期天

    除了数字还有几个特殊的符号就是“*”“/”“-”“,,*代表所有的取值范围内的数字,/代表每的意思,*/5代表每5个单位,-代表从某个数字到某个数字,“,”分开几个离散的数字。

    例子1:   0 8 5 6 *  command  表示每65日的8点整执行命令;

    例子2: 10,30,50 * * * * date  表示每小时的10分,30分,50分显示时间

    例子3: 0 6 * * * * echo “good morning” >>/tmp/test.xt 每天早上6点执行,注意单纯的echo从屏幕上看不到任何输出,因为cron把任何输出都会通过mail发送给用户;

    例子4: 0 */2 * * * echo “hi” 每两个小时执行一次;

    例子5: 0 11 4 * 1-3 command 表示每个月的4号和每个礼拜的13的早上11点执行

3通常,系统并不允许用户直接编辑计划书,/var/spool/cron/crontabs目录也只有root用户才可读写。为了方便计划书的管理,系统提供了crontab命令:crontab -u username –e

补充说明:

3.1. 环境变量,cron进程执行任务时,并不加载计划书所属用户的环境变量,只加载几个最基本的环境变量,比如执行任务的sh,$HOME,$MAILTO等。这几个环境变量的定义是在 /etc/crontab文件中。其中$MAILTO是指定计划执行过程中发生错误或者有数据输出时发 送邮件到哪个用户。通常会在脚本中加入. /etc/profile 或者. ~/.bash_profile即可。

3.2. 不能运行crontab命令或者计划没有被执行,crontab的权限设置是由两个文件来决定的 /etc/cron.allow, /etc/cron.deny。如果存在/etc/cron.allow,则把要执行计划的 用户名称添加到其中;若/etc/cron.deny存在,则确保要执行计划的用户名称不在 /etc/cron.deny中;如果两个文件都存在,/etc/cron.allow优先。

3.3. 计划书的输出和日志,如果用户的计划书在运行时有输出,用户是无法直接从终端上看 到的。cron进程会将执行计划时产生的所有输出数据和错误信息发送到指定用户的邮箱 ,用户可到邮箱中去查看,所以建议在计划中把有用的输出数据重定向到文件中。要想 查看各个计划的执行情况,可以查看cron进程的日志文件:/var/log/cron

3.4. 更简单的任务计划, 如果觉得这样麻烦,还有一种简单的方法。/etc下面有4个目录: cron.hourlycron.dailycron.weeklycron.weekly,这4个目录下脚本的执行周期 分别是每小时,每天,每周,每月。根据自己的需要,将要运行的脚本直接放置到对应 的目录下即可,系统会自动为你完成任务。

3.5.使用注意事项:每月几号和周几一般不同时使用,如 1 9 * * 3 :表示每周三执行一次;

Crontab –e 打开编辑界面定义任务时先启用临时文件,如果刚到此时间点执行而没有编辑会怎么样?

4anacron: crontab的补充机制,检查有没有过去的一个有效周期未曾执行的任务,如果有,在开机后的指定时间点执行一次;这个是系统设置好了,清理系统垃圾或者是自动执行某些脚本的系统任务,一般我们做了解就行了,不要更改。配置文件是/etc/anaconrtab。

以上是自己总结的一些心得体会,任务计划是实现自动化运维的重要命令,希望大家重视,如有问题请多指点。

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!