Linux系统的进程调度(任务调度)

  

  进度调度:在未来某个时间点,让系统自动执行我们事先编写好的命令或脚本的列表,从而使得即使用户不在计算机旁边也可以按时完成任务;


  为了能够进行进程调度,就必须要有一种机制能够识别事件发生的时间并且能够运行用户所预期的命令;这种机制在Linux中是通过特定的守护进程来实现的;

    这类守护进程包括:

      atd:

        将预先编写好的命令在未来某个时间点执行一次;

      crond:

        将预先编写好的命令在未来的符合条件的时间点重复执行;


    查看此类守护进程是否正常运行:

      centos6:

        service {atd|crond} status


        结果为runnig或者“正在运行”,都表示其正常工作


      centos7:

        systemctl status {atd.service|crond.service}


        结果为active(runnig)就表示其正常工作


    所有的进程调度的结果都会以电子邮件的方式发送到用户的邮箱中;

      本地电子邮件服务:

        SMTP:simple mail transfer protocol,简单邮件传输协议,TCP/25;

        POP3:post-office protocol version 3,邮局协议第三版,TCP/110;

        IMAP4:internet mail access protocol version 4,互联网邮件访问协议第四版,TCP/143;


        整个电子邮件系统分成四大部分:

          MUA:mail user agent,邮件用户代理,帮助用户发送电子邮件到服务器或者帮助用户从服务器接收电子邮件的应用程序;

          MTA,MDA,MRA


          常用的MUA:

            浏览器,Outlook,Foxmail,mail|mailx


          mail [-s SUBJECT] USERNAME[@HOSTNAME]


          /var/spool/mail/username就是每个用户的邮件;


          为了能够非交互的发送邮件,可以使用输入重定向或管道;


    atd守护进程能够识别和完成由at命令、batch命令制作的任务计划;


    周期性执行任务计划:cron

      cronie软件包,提供cron守护进程以及cron的其他管理工具;


      cron任务通常分为两类:

        系统cron任务:/etc/crontab


          SHELL=/bin/bash

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

          MAILTO=root

          HOME=/


          # 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

          # |  |  |  |  |

          # *  *  *  *  * user-name command to be executed


          注意:

          1.

           *  *  *  *  *:定义周期执行任务的时间

           user-name:运行此任务的用户账户身份;

           command to be executed:应该执行的任务命令及命令行参数;

            注意:为了保证任务能够准确执行,命令通常是绝对路径填写;


          2.各个字段之间使用一个或多个空白字符进行分隔;


          3.任务运行的结果以邮件的方式直接发送给root用户;


        用户cron任务:/var/spool/cron/USERNAME


          SHELL=/bin/bash

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

          MAILTO=root

          HOME=/


          # 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


          注意:

          1.

           *  *  *  *  *:定义周期执行任务的时间

           command to be executed:应该执行的任务命令及命令行参数;

            注意:为了保证任务能够准确执行,命令通常是绝对路径填写;


          2.各个字段之间使用一个或多个空白字符进行分隔;


          3.任务运行的结果以邮件的方式直接发送给用户;


        时间表示法:

          1.特定时间:给定时间点的有效取值范围内的所有有效值;

            0  5  3   9  *

              0:分钟

              5:小时

              3:日期

              9:月份

              *:星期

          2.通配符时间:*,表示“每...”之意,给定时间的所有有效值; 

             *  *  *  *  * 

          3.离散时间:在给定的时间点上,使用逗号分隔;

            0  8,20  *  *  1,3,5

            每周1,3,5 早8点到晚8点

          4.连续时间:在给定的时间点上,使用减号分隔;

            0  8  *  *  1-5

          5.步长时间:在给定的时间电商,使用除号分隔;

            */2  *  *  *  * 

            */7  *  *  *  *  此种方式无法实现每7分钟间隔执行计划任务(单位必须能被整除);     


          注意:

            1.指定的步长必须能被时间点的数值整除,否则,无意义;

            2.最小的时间单位是分钟,如果计划以秒为执行计划任务的时间单位,必须借助于其他机制;


  at:在指定时间执行命令。

    选项:

      -q QUEUE;

      -f FILE;

      -l:查看队列,相当于atq;

      -d JOB_ID:清除指定的计划作业,相当于atrm;

      -c:想看置顶的作业内容;

  at [option] time

    time:

      1.HH:MM [YYYY-mm-dd]

      2.noon,midnight,teatime

      3.tomorrow

      4.now+#UNIT  UNIT:min,hours,days,weeks,months,years,...


    at定义的作业有队列的概念,通常队列使用单个字母来表示,默认是a;

      at -q QUEUE_NAME TIME

    例子:

      at 5pm+3 days(三天后的下午 5 点锺执行/bin/ls)

      at> /bin/ls 

      at> job 7 at 2013-01-08 17:00


  batch命令:batch命令在定义任务的时候,无需指定时间,是由系统自行选择在系统比较空间的时候,完成此计划任务;其他的配置与at命令完全相同;

    选项:

      -f:指定包含具体指令的任务文件; 

      -q:指定新任务的队列名称; 

      -m:任务执行完后向用户发送E-mail。

    例子:

      batch 

      at> echo 1234 

      at> <EOT>

      job 5 at Sun Apr 28 08:49:00 2013


  mail:命令行的电子邮件发送和接收工具。

    选项:

      -b<地址>:指定密件副本的收信人地址; 

      -c<地址>:指定副本的收信人地址; 

      -f<邮件文件>:读取指定邮件文件中的邮件; 

      -i:不显示终端发出的信息; 

      -I:使用互动模式; 

      -n:程序使用时,不使用mail.rc文件中的设置; 

      -N:阅读邮件时,不显示邮件的标题; 

      -s<邮件主题>:指定邮件的主题; 

      -u<用户帐号>:读取指定用户的邮件; 

      -v:执行时,显示详细的信息。

    例子:

      mail -s "Hello from linuxde.net by shell" admin@linuxde.net 

      hello,this is the content of mail. 

      welcome to www.linuxde.net

    注意:

      第一行是输入的命令,-s表示邮件的主题,后面的admin@linuxde.net则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D结束输入,此时会提示你输入Cc地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。


  crontab:用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

    选项:

      -u username:超级用户为其他用户设置或编辑用户cron任务时使用;

      -l:查看所有的已经被定义的计划任务;

      -e:使用vi编辑器编辑crontab文件;

      -r:移除所有的计划任务;不推荐使用;

      -i:在使用-r选项时,进行交互;

    例子:

      crontab -e

      */6  *  *  *  * sleep 60 ';' ls >/dev/null