概述
本章將為大家介紹一些進程管理的補充部分作業管理和任務的并發執行,同時也將介紹一下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…
2、任務的并發執行
方式一:(command1 &);(command2 &);(command3 &)…
方式二:將各個任務寫入腳本,然后執行該腳本,腳本內容如:
command1 &
command2 &
command3 &
方式三:{ command1 & command2 & command3 & … }
[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的比較
第四章 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