Linux作业管理、并发执行、计划任务

概述

    本章将为大家介绍一些进程管理的补充部分作业管理和任务的并发执行,同时也将介绍一下Linux系统上计划任务的相关内容,具体分为:

        1、Linux作业管理

        2、任务的并发执行

        3、at计划任务

        4、cron计划任务

        5、计划任务实际效果演示

第一章    Linux作业管理

    

    1、前台作业和后台作业的概念

        前台作业:通过终端启动,且启动后一直占据终端;
        后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

    2、如何让作业运行于后台:

        作业尚未运行:COMMAND &   

        作业已经运行:Ctrl+z 

    3、作业与终端的关系

        如果用ctrl+z或者COMMAND & 将作业调往后台,一旦用户退出终端,该进程也会相应停止,因为作业与当前终端相关,如果把作业送往后台后,不希望作业随着终端结束而终止            

            nohup COMMAND & 

            或screen COMMAND

        这样就可以实现终端退出后,后台的进程不终止

    4、前后台切换

        如何让送往后台的作业回到前台继续执行:

            fg [%]JOB_NUM

        如何让送往后台的作业放到后台继续执行:

            bg [%]JOB_NUM

        查看有哪些作业号:jobs

        jobs查看到的后台作业中,显示有+ -之类的,+代表如果利用fg后面不指定作业号时,默认调用的第一个作业,-为第二个作业,越早送到后台的作业,如果调回前台时,不指定作业号,越晚被调回

    5、如何终止作业的执行:

        要用kill %JOB_NUM  这时%不能省略,因为省略了,kill会将后面的数字当做是PID号,而不是后台作业号

第二章    任务的并发执行

    

    1、任务的顺序执行:

        command1;command2;command3…

        blob.png

    2、任务的并发执行

        方式一:(command1 &);(command2 &);(command3 &)…

        方式二:将各个任务写入脚本,然后执行该脚本,脚本内容如:             

                    command1 &

                    command2 &

                    command3 &

        方式三:{ command1 & command2 & command3 & … }

        blob.png

        blob.png

    [root@localhost ~]# vim check.sh     
    [root@localhost ~]# cat check.sh         //此时是顺序执行
    #!/bin/bash
    ping -c 3 10.1.32.72
    ping -c 3 10.1.0.1
    [root@localhost ~]# bash check.sh 
    PING 10.1.32.72 (10.1.32.72) 56(84) bytes of data.
    64 bytes from 10.1.32.72: icmp_seq=1 ttl=64 time=0.723 ms
    64 bytes from 10.1.32.72: icmp_seq=2 ttl=64 time=0.611 ms
    64 bytes from 10.1.32.72: icmp_seq=3 ttl=64 time=0.284 ms
    
    --- 10.1.32.72 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
    rtt min/avg/max/mdev = 0.284/0.539/0.723/0.187 ms
    PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data.
    64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=0.418 ms
    64 bytes from 10.1.0.1: icmp_seq=2 ttl=64 time=0.555 ms
    64 bytes from 10.1.0.1: icmp_seq=3 ttl=64 time=0.549 ms
    
    --- 10.1.0.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    rtt min/avg/max/mdev = 0.418/0.507/0.555/0.065 ms
    [root@localhost ~]# vim check.sh 
    [root@localhost ~]# cat check.sh                       //此时是并发执行
    #!/bin/bash
    ping -c 3 10.1.32.72 &
    ping -c 3 10.1.0.1 &
    [root@localhost ~]# bash check.sh 
    [root@localhost ~]# PING 10.1.32.72 (10.1.32.72) 56(84) bytes of data.
    64 bytes from 10.1.32.72: icmp_seq=1 ttl=64 time=0.342 ms
    PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data.
    64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=0.483 ms
    64 bytes from 10.1.32.72: icmp_seq=2 ttl=64 time=0.596 ms
    64 bytes from 10.1.0.1: icmp_seq=2 ttl=64 time=5.38 ms
    64 bytes from 10.1.32.72: icmp_seq=3 ttl=64 time=0.702 ms
    
    --- 10.1.32.72 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
    rtt min/avg/max/mdev = 0.342/0.546/0.702/0.153 ms
    64 bytes from 10.1.0.1: icmp_seq=3 ttl=64 time=0.435 ms
    
    --- 10.1.0.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2002ms
    rtt min/avg/max/mdev = 0.435/2.102/5.389/2.324 ms
    
    [root@localhost ~]#

第三章    at计划任务

    1、计划任务的概述

        未来的某时间点执行一次某任务:at、batch

        周期性运行某任务:crontab

        如果执行结果中有标准输出和错误输出,则输出结果会以邮件的形式发送给用户

    2、at计划任务(at的执行需要atd服务的正常运行)

        at命令(未来一次执行某任务,执行结果以邮件发送给提交任务的人)

        语法:at [OPTION]… TIME

            选项:

                -l  显示at作业队列,相当于atq

                -f /PATH/TO/SOMEFILE 从指定文件中读取作业任务,而不用交互式输入

                -d #  删除队列中的#作业号,相当于atrm #

                -c #  查看队列中的#作业号中的具体内容

                -q QUEUE  指明队列

                -m    当任务被完成之后,将给用户发送邮件,即使没有标准输出

            TIME格式:

                HH:MM  如 18:58

                HH:MM YYYY-mm-dd  如18:58  2016-8-8

                noon  表示中午12点

                midnight  表示晚上12点

                teatime  表示下午4点

                tomorrow

                now+#  表示现在的时间加上多少时间

                    时间单位可以是:minutes、hours、days、weeks

                    例如 now+5minutes

                    例如:at now+10minutes输入完成后回车会进入at的任务提示符界面,只需要在提示符界面输入相应需要执行的脚本或者命令,输入完成后,ctrl+d提交即可

        at的作业有队列,用单个字母表示,默认都使用a队列,at队列存放在/var/spool/at目录中

        at -l 表示显示出at提交的作业列表,也可以利用atq命令直接查询(只显示未运行的,运行过的不会显示)运行结果会以邮件发送

        执行方式:
            1)交互式 2)输入重定向 3) at –f 文件

        at任务的用户控制功能
            通过/etc/at.{allow,deny}控制用户是否能执行at任务,先寻找/etc/at.allow 文件,文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在at.deny 当中)
            如果/etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者则可使用 at 命令。如果两个文件都不存在,只有 root 可以使用 at 这个命令

         

            如果拒绝任何普通用户执行,可以新建/etc/at.allow,里面没有任何内容,这样就可实现禁止普通用户执行at

            如果拒绝任何普通用户执行,还可以删除/etc/at.allow,和/etc/at.deny 这样就可实现禁止普通用户执行at

[root@localhost ~]# date
2016年 09月 08日 星期四 20:18:29 CST
[root@localhost ~]# at 20:20       //编辑at定时任务
at> echo nihao
at> echo "nwc at task"  
at> <EOT>                         //交互式编辑完成后用ctrl+d进行提交
job 4 at 2016-09-08 20:20
[root@localhost ~]# at -l         //查看at定时任务的列表
4 2016-09-08 20:20 a root
[root@localhost ~]# at -c 4        //查看at任务列表某指定任务的详细信息
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
HOSTNAME=localhost.localdomain; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=10.1.32.88\ 53626\ 22; export SSH_CLIENT
QTDIR=/usr/lib64/qt-3.3; export QTDIR
QTINC=/usr/lib64/qt-3.3/include; export QTINC
SSH_TTY=/dev/pts/0; export SSH_TTY
USER=root; export USER
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:此处省略若干颜色定义:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=zh_CN.UTF-8; export LANG
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
QTLIB=/usr/lib64/qt-3.3/lib; export QTLIB
CVS_RSH=ssh; export CVS_RSH
SSH_CONNECTION=10.1.32.88\ 53626\ 10.1.32.68\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
G_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMES
cd /root || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER6e501d58'            //显示出来的信息上部分都为执行该任务的相关环境的定义
echo nihao
echo "nwc at task"

marcinDELIMITER6e501d58
[root@localhost ~]# atq          //查看at任务列表
4 2016-09-08 20:20 a root
[root@localhost ~]# date                  //发现任务时间已经到了,任务已经执行,
2016年 09月 08日 星期四 20:20:05 CST
[root@localhost ~]# mail                 //但是由于任务是标准输出,故以邮件告知用户
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
>N  1 root                  Thu Sep  8 20:20  15/507   "Output from your job        4"
& 1
Message  1:
From root@localhost.localdomain  Thu Sep  8 20:20:01 2016
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job        4
To: root@localhost.localdomain
Date: Thu,  8 Sep 2016 20:20:00 +0800 (CST)
From: root@localhost.localdomain (root)
Status: R

nihao
nwc at task

& q
Held 1 messages in /var/spool/mail/root
You have mail in /var/spool/mail/root
[root@localhost ~]#

第四章    cron计划任务

    at计划任务只能保证任务的单次执行,cron计划任务,可以实现任务的周期性执行,一旦到了指定时间会自动运行

    1、cron相关的程序包

            cronie: 主程序包,提供crond守护进程及相关辅助工具
            cronie-anacron: cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
            crontabs:包含CentOS提供系统维护任务

    2、cron的相关文件

            系统cron任务:系统维护作业,通过编辑配置文件来定义任务
                /etc/crontab
            用户cron任务:
                crontab命令来定义任务,对应的文件在/var/spool/cron/USERNAME
            日志: /var/log/cron

    3、系统cron任务        

            系统cron的配置格式:配置文件为/etc/crontab

                # 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) 

                # |  |  |  |  |

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

                注意:

                    <1>每一行定义一个周期性任务(共7个字段)

                        *  *  *  *  *:定义周期性时间

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

                        command to be executed :任务

                    <2>此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量;

                    <3>执行结果如果是标准输出或错误输出,结果将发送给指定用户

        系统自身的计划任务的文件路径:

            /etc/crontab
            /etc/cron.d/ 配置文件
            /etc/cron.hourly/ 脚本
            /etc/cron.daily/ 脚本
            /etc/cron.weekly/ 脚本
            /etc/cron.monthly/脚本

            系统相关的任务:如日志切割、/tmp目录下的文件下的定期清除都是在以上路径的相关脚本中定义的

        Linux对临时文件的管理

            rhel6.0使用/etc/cron.daily/tmpwatch定时清除临时文件。

            rhel7.0使用systemd-tmpfiles-setup服务实现
                配置文件:
                    /etc/tmpfiles.d/*.conf
                    /run/tmpfiles.d/*.conf
                    /usr/lib/tmpfiles/*.conf
                    /usr/lib/tmpfiles.d/tmp.conf
                    d /tmp 1777 root root 10d
                    d /var/tmp 1777 root root 30d
                命令:
                    systemd-tmpfiles –clean|remove|create configfile

    4、用户cron任务

            用户cron的配置格式:配置文件为/var/spool/cron/USERNAME

                # 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 – 7) (Sunday=0 or 7) 

                # |  |  |  |  |

                # *  *  *  *  * command to be executed

                注意:

                    <1>每一行定义一个周期性任务(6个字段)

                        *  *  *  *  *:定义周期性时间

                        command to be executed :任务

                    <2>此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量;

                    <3>执行结果如果是标准输出或错误输出,结果将以邮件发送给当前用户

    5、时间表示法:(星期几和每个月的第几日不要同时定义)

            <1>特定值:给定时间点有效取值范围内的值

            <2>*表示给定时间点上有效取值范围内的所有值

            <3>离散取值:,

                    在指定时间点上用,(逗号)隔开的多个值

            <4>连续取值:-

                    在指定时间点上用-连接开头和结束

            <5>在指定时间点上,定义步长/

                    当指定的时间点,不能被步长整除时,将失去意

            <6>特定的时间格式:

                @reboot     表示每次重启之后运行一次
                @yearly     表示每年运行一次,功能相当于 0 0 1 1 *
                @annually   表示每年运行一次,功能相当于0 0 1 1 *
                @monthly    表示每月运行一次,功能相当于0 0 1 * *
                @weekly     表示每周运行一次,功能相当于0 0 * * 0
                @daily      表示每天运行一次,功能相当于0 0 * * *
                @hourly     表示每小时运行一次,功能相当于0 * * * *

            例如:        

                5 * * * *:每小时执行一次,每小时的第3分钟执行

                3 4 * * 5:每周执行一次,每周5的4点3分执行

                5 6 7 * *:每月执行一次,每月的7日6点5分执行

                7 8 9 10 *:每年执行一次,每年的10月9日8点7分执行

                9 8 * * 3,7:每周3和周日的8点9分

                0 8,20 * * 3,7:每周3和周日的8点和20点执行

                * 8,20 * * 3,7: 每周3和周日的8点和20点的每一分钟都执行

                0 9-18 * * 1-5:周一到周五的9-18点的整点执行

                */5 * * * *:表示每5分钟执行一次

            注意:cron自身的最小时间单位为分钟,想完成秒级别的任务,需要借助额外的机制,在脚本中利用循环执行

    6、crontab命令:

            格式:crontab [-u user] [-l|-r|-e] [-i] [-s]

                选项:

                    -e 编辑就任务;

                    -l 列出所有任务

                    -r 移除所有任务;即删除/var/spool/cron/UASERNAME文件;要想删除某一条任务,可以用-e去编辑,单独删除

                    -i 当用-r移除所有任务时,会提示交互式提示用户确认

                    -u user:root用户可为指定用户身份定义定时任务

            运行crontab -e后会自动调用vim编辑器进行编辑,出现语法错误时会提示,这也就是为什么不建议直接用vim编辑配置文件的原因

            运行结果以邮件通知给当前用户,如果拒绝接受邮件,可以利用>/dev/null,这样就实现了执行正确后,不发送执行结果,但执行错误后依然会邮件发送,如果错误的邮件也不想收,可以&>/dev/null

            例如:

                crontab -e

                * * * * * /bin/echo "hello" >/dev/null

            注意:定义任务时,如果命令中需要用到%,需要对其进行转义,但放置于单引号中的%不用转义亦可

    7、crontab编辑任务的权限管理(管理方式与at的方式类似)

            通过/etc/cron.{allow,deny}控制用户是否能执行crontab任务,先寻找/etc/cron.allow 文件,文件中的使用者才能使用crontab来定义计划任务 ,没有在这个文件中的使用者则不能使用 crontab (即使没有写在crontab.deny 当中)
            如果/etc/cron.allow 不存在,就寻找 /etc/cron.deny 这个文件,若写在这个 cron.deny 的使用者则不能使用crontab来定义计划任务 ,而没有在这个 cron.deny 文件中的使用者则可使用 crontab命令。如果两个文件都不存在,只有 root 可以使用 crontab这个命令

    8、anacron:

        当定义的cron任务,在指定的时间点,因故未能执行,下次开机后,如果没有额外的定义,是不会补充执行的,如果希望开机后,无论是否到了相应指定的时间点,都要执行一次,可使用anacron实现

        运行计算机关机时cron不运行的任务, CentOS6.0以后版本取消anacron服务,由crond服务管理

        配置文件: /etc/anacrontab

            负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。 /etc/cron.hourly/由/cron.d/0hourly执行
            字段1:如果在这些日子里没有运行这些任务……
            字段2:在重新引导后等待这么多分钟后运行它
            字段3:任务识别器,在日志文件中标识
            字段4:要执行的任务

    9、at和cron的比较

    blob.png

第四章    cron计划任务的实际效果演示

    1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“ etc-yyyy-mm-dd-HH.tar.xz”

[root@localhost backup]# crontab -e
crontab: installing new crontab
[root@localhost backup]# crontab -l
0 */4 * * * /bin/tar Jcf /backup/etc-`date +\%F-\%H`.tar.xz /etc/ &>/dev/null
#######由于%在cron任务计划中有特殊意义,故要转意#################

[root@localhost ~]# cd /backup/
[root@localhost backup]# ls
etc-2016-09-08-21.tar.xz

    2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”

[root@localhost backup]# crontab -e
crontab: installing new crontab
[root@localhost backup]# crontab -l
#######由于%在cron任务计划中有特殊意义,故要转意#################

0 2 * * 2,4,7 /bin/cp -a /var/log/messages /logs/messages-`date +\%Y\%m\%d` &>/dev/null
[root@localhost ~]# ls /logs/
messages-20160908
[root@localhost ~]#

    3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中

[root@localhost ~]# crontab -e
crontab: installing new crontab
[root@localhost ~]# crontab -l
0 */2 * * * /bin/grep "^[SM]" /proc/meminfo >> /tmp/meminfo.txt 
[root@localhost backup]# cat /tmp/meminfo.txt 
MemTotal:        1004136 kB
MemFree:          788332 kB
SwapCached:            0 kB
Mlocked:               0 kB
SwapTotal:       1023996 kB
SwapFree:        1023996 kB
Mapped:            13780 kB
Shmem:               220 kB
Slab:              44240 kB
SReclaimable:      16760 kB
SUnreclaim:        27480 kB
[root@localhost ~]#

    4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报

[root@localhost ~]# vim check.sh
[root@localhost ~]# cat check.sh 
#!/bin/bash
disk=`df|sed -nr '/^\/dev\/sd/s@.*[[:space:]]+([[:digit:]]+)%.*@\1@p'|sort
if [ $disk -ge 80 ];then
	wall "Disk is full"
fi
[root@localhost ~]# crontab -e
crontab: installing new crontab
[root@localhost ~]# crontab -l
*/10 * * * * /root/check.sh 
[root@localhost ~]#
Broadcast message from root@localhost.localdomain (pts/0) (Thu Sep  8 21:57:26 2016):

Disk is full
[root@localhost ~]#

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/44657