Linux学习笔记:Linux系统的进程调度(任务调度)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习笔记:Linux系统的进程调度(任务调度)相关的知识,希望对你有一定的参考价值。

     今天我们学习了Linux系统的进程调度,进程调度是为了在未来某个时间点,让系统自动执行我们事先编写好的命令或脚本的列表,从而使得即使用户不在计算机旁边也可以按时完成任务。这样有利于我们更好的进行任务计划以及在需要执行任务的时候自动完成我们设定好的命令,从而完成任务。

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

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

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

    我们在进行任务调度时需要先查看守护进程是否运行,所以我们来查看守护进程运行与否的命令如下:

    在Centos6中:

        ]# service {atd|crond} status

        结果为running或者"正在运行",都表示其正常工作

    在Centos7中:

        ]# systemctl status {atd.service|crond.service}

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

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

本地电子邮件服务:
                SMTP:Simple Mail Transfer Protocol,简单邮件传输协议,TCP/25
                POP3:Post-Office Protocol Version 3,邮局协议第三版,TCP/110
                IMAP4:Internet Mail Access Protocol Version 4,互联网邮件访问协议第四版,TCP/143

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

at命令:
        at, batch, atq, atrm - queue, examine or delete jobs for later execution

        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

            选项:
                -q QUEUE
                -f FILE
                -l:查看队列,相当于atq
                -d JOB_ID:清除指定的计划作业,相当于atrm
                -c:查看指定的作业的内容

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

    下面就是周期性任务调度计划:cron

    cronie软件包,提供crond守护进程以及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 *
                2.通配符时间:*,表示"每..."之意,给定时间点的所有有效值;
                    * * * * *
                3.离散时间:在给定的时间点上,使用逗号分隔;
                    0 8,20 * * 1,3,5
                4.连续时间:在给定的时间点上,使用减号分隔;
                    0 8 * * 1-5
                5.步长时间:在给定的时间点上,使用除号分隔;
                    */2 * * * *
                    */7 * * * * 此种方式无法实现每7分钟为间隔执行计划任务;

                注意:
                    1.指定的步长必须能被时间点的数值整除,否则,无意义;
                    2.最小的时间单位是分钟,如果计划以秒为执行计划任务的时间单位,必须借助于其他机制。



以上是关于Linux学习笔记:Linux系统的进程调度(任务调度)的主要内容,如果未能解决你的问题,请参考以下文章

《Linux内核设计与实现》读书笔记- 进程的调度

Linux学习笔记:001Linux内核分析

学习笔记

Linux内核分析第四章 读书笔记

Linux学习笔记9

Linux学习笔记—— Linux进程概念