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.www58058.com/44657

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-09-08
下一篇 2016-09-09

相關推薦

  • Linux基礎知識之GUN awk

    awk:報告生成器,格式化文本輸出    基本用法:    gawk [options] 'program' FILE …    options:     &…

    Linux干貨 2016-09-20
  • 馬哥教育網絡班21期+第4周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@localhost ~]# cp -r /etc/skel /home/ && mv /home/skel&nbsp…

    Linux干貨 2016-08-02
  • 文本處理工具之awk

                    文本處理工具之AWK 一、linux文本處理工具三劍客:grep 、sed、 awk。其中grep是一種文本過濾器,sed是文本行編輯器,而awk是一種報表生成器,就是對文件進行…

    2017-05-21
  • bash變量之位置參數變量

        什么是變量     變量是 bash 環境中非常重要的一個玩意兒,就是讓某一個特定字串代表不固定的內容就是了,講的更簡單一點,我們可以“用一個簡單的 "字眼" 來取代另一個比較復雜或者是容易變動的數據”。    &nbsp…

    Linux干貨 2016-08-15
  • Shell腳本編程—特殊用法(select)及函數、遞歸

    Shell腳本編程—特殊用法及函數   一、while的特殊用法: 1、使用格式: while read 變量名;do    循環體 done </PATH/TO/filename 注:依次從指定的文件中的內容逐行讀取,并把讀取到的每行賦值給變量。 2、例題: 掃描/etc/passwd文件每一行,如發現GECOS字段為空…

    Linux干貨 2016-08-21
  • httpd服務之虛擬主機、訪問控制、https配置詳解

    前言 上文講解了http協議及httpd的一些特性,是學習web服務需要掌握的一些基礎知識,接下來讓我們進一步了解httpd相關功能的配置,本文講解的是虛擬主機,訪問控制及https等功能的配置。 httpd之虛擬主機 虛擬主機共分為三種模式:基于IP、基于端口、基于主機名(FQDN) 實驗環境介紹 開始之前,先介紹一下httpd在CentOS6.6版本及文…

    Linux干貨 2015-04-14
欧美性久久久久