#22 系統進程調度、at、batch、mail、crontab
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" [email protected]
hello,this is the content of mail.
welcome to www.linuxde.net
註意:
第一行是輸入的命令,-s表示郵件的主題,[email protected],輸入完這行命令後回車,會進入郵件正文的編寫,我們可以輸入任何文字,比如上面的兩行。當郵件正文輸入完成後,需要按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
#22 系統進程調度、at、batch、mail、crontab