Linux工作排程的種類:at,cron
兩種工作排程的方式:
一種是例行性的,就是每隔一定的周期要來辦的事項(通過at實作);
一種是突發性的,就是這次做完以後就沒有的那一種(通過cron實作)。
一、突發性的工作排程(at)
要使用單一工作排程,我們的Linux系統上面由atd來負責這個排程的服務,首先啟動/etc/init.d/atd restart
可以設定一下開機時就啟動這個服務,免得每次重新啟動都得再來一次。 chkconfig atd on
at安全管理
/etc/at.deny
将不可以使用at的帳号寫入其中,若未記錄到這個檔案當中的使用者,就可以使用at
at的參數使用
at [-m -v -c -l -d] TIME
-m 當at的工作完成後,即使沒有輸出資訊,以 email通知使用者該工作已完成
-l 相當于atq,列出所有使用者的at任務
-d 相當于atrm,去掉at的任務
-v 可以用較明顯的時間格式列出at排程中的工作
-c 列出後面接的該項工作的實際指令内容
TIME:時間格式,這裡可以定義什麼時候要進行at這項工作時間,格式有:
HH:MM ex>04:00
HH:MM YYYY-MM-DD ex>04:00 2012-04-01
HH:MM[am|pm] [Month] [Date] ex>04:00 March 17
HH:MM[am|pm] +number [minutes|hours|days|weeks]
ex>now +5 minutes 就是說,在現在在加5minutes後進行該工作排程。
編寫例行性工作時應注意:
使用指令時盡量用絕對路徑,
用Ctrl+d 結束編寫。
at工作的管理
at并不像cron那樣,可以用crontab -e來編輯自己的工作排程,
當我們發現指令輸入錯誤,就目前來講,隻能删除它。
(因為at的存放檔案并不像crontab,at指令的存放檔案為二進制檔案[/var/spool/at/,對應的工作排程執行過後,則其二進制檔案也就消失了],可用od檢視,從簡單使用的角度來講,若指令錯了,直接删除(atrm)重建)
atq 查詢目前主機上面有多少的at工作排程;
atrm 後加工作序列号,删除該工作任務。
二、例行性的工作排程(cron)
cron安全管理
/etc/cron.deny
将不可以使用crontab的帳号寫入其中,若未記錄到這個檔案當中的使用者,就可以使用crontab.
crontab的參數使用
-u -e -l -r
-u 隻有root才能進行這個任務,也即幫其他使用者建立 、删除crontab工作高度;
-e 編輯crontab的工作内容;
-l 查閱crontab的工作内容;
-r 删除所有的crontab的工作内容,若僅要删除一項 ,請用-e去編輯。
範例:用root的身份在每天的12:00發信給自己
crontab -e
#此時進入vi的編輯器界面。
0 12 * * * mail root -s "at 12:00" </root/.bashrc
#分 時 日 月 周 |<-------------指令串------------------>|
預設情況下,任何使用者隻要不被列入/etc/cron.deny當中,那麼他就可以直接執行“crontab -e”去編輯自己的例行性指令了。當使用者使用crontab這個指令來建立工作排程之後,該項工作就會被記錄到/vart/spool/cron裡面去了,而且是以帳号來作為判别的。
crontab指令的特殊字元:
* 代表任何時刻都接受的意思
, 代表分隔時段的意思,舉例:要執行工作3:00和6:00時,就是 0 3,6 * * * cdommand
- 代表一段時間範圍内,
/n 即是第隔n機關間隔的意思
舉例:*/5 * * * * command 即是每隔5分鐘執行一次這個指令
可能有時處于停機狀态時,crontab指令就不能執行,這時就需要anacron來可喚醒停機期間的工作任務
anacron 以天為機關或者在開機後立刻進行anacron的操作,它會去檢測停機期間應該進行但是并沒有進行的crontab任務,并将該任務執行一遍,然後anacron就會自動停止了。
由于/etc/cron.daily内的任務比較多,是以我們使用每天進行的任務來解釋一下anacron的運作情況好了。anacron若執行“anacron -scron.daily”時,它會這樣運作的:
1.由/etc/anacrontab分析到cron.daily這項工作名稱的天數為1天;
2.由/var/spool/anacron/cron.daily取出最近一次執行anacron的時間戳;
3.由上個步驟與目前的時間比較,若差異天數為1天以上(含1天),就準備進行指令;
4.若準備進行指令,根據/etc/anacrontab的設定将延遲65分鐘;
5.延遲時間過後,開始執行後續指令,即“run-parts /etc/cron.daily"這個指令;
6.執行完畢後,anacron程式結束。
現在你知道為什麼隔了一陣子才将linux開機時,開機過後約1小時左右系統會有一小時段的忙碌,而且硬碟會跑個不停!那是因為anacron正在執行過去crontab未執行的各項工作排程。
程序管理:
jobs -l
<a href="http://blog.51cto.com/attachment/201211/123112918.png" target="_blank"></a>
注:其實+代表最近被放到背景的工作号碼,-代表最近最後第二個被放置到背景中的工作号碼。而超過最後第三個以後的工作,就不會有+、-符号存在了!
工作狀态是stopped,若工作狀态為done,說明已經結束了,即便是最近沒有+号,當你在執行一次jobs,就已經看不到該工作了。
<a href="http://blog.51cto.com/attachment/201211/123718543.png" target="_blank"></a>
程序的執行順序
priority與nice
PRI 值越低代表越優先,這個PRI的值是由核心動态調整的,使用者無法直接調整PRI值,
可通過Nice值,
PRI(new)=PRI(old)+nice
nice值可以調整的範圍為-20—19;(root)
普通使用者調整的範圍為0—19
nice 是對即将執行的指令
#用root給一個nice值為-5,用于執行vi,并檢視該程序!
[root@www ~]nice -n -5 vi &
renice 是對正在執行的執行
renice [number] PID
[root@www ~]renice 10 18625
kill -signal PID
可以幫我們将這個signal傳送給某個工作(%jobnumber)或者是某個PID(直接輸入數字。要再次強調的是:kill後面直接加數字與加上%jobnumber的情況是不同的!這個很重要。因為工作控制中有1号工作,但是PID1号則是專指“init”這個程序。你怎麼可以将init關閉呢?關閉init,你的系統就死掉了啊!是以記得那個%是專門用在工作控制的。
舉例:如下圖:用vim在背景運作,用jobs檢視,并想通過kill 1來删除該工作号,發現并不能成功,會彈出說是不允許的操作,因為kill 1并不是殺掉1号工作,而是關閉init,即系統的主程序,當然是不允許的了。
<a href="http://blog.51cto.com/attachment/201210/172828722.png" target="_blank"></a>
應該用kill %1,就能正确關閉1号工作了。
<a href="http://blog.51cto.com/attachment/201210/172842493.png" target="_blank"></a>
killall -signal 指令名稱
由于kill後面必須要加上PID(或者是jobnumer),是以,通常kill都會配合ps,pstre等指令,因為我們必須要找到相對應的那個程序的ID。但是,如此一來,很麻煩,可以直接用killall 其後直接跟指令名稱,
killall -1 httpd 可以讓PID重新讀取自己的配置檔案,類似重新啟動httpd服務
也可以用 pkill -1 httpd
killall -9 httpd 強制終止所有以httpd啟動的程序;
killall -i bash 依次詢問每一個bash程序是否需要被終止進行。
總之,要删除某個程序,我們可以使用PID或者啟動該程序的指令名稱,而如果要删除某個服務呢,最簡單的方法就是利用killall,因為它可以将系統當中所有以某個指令名稱啟動的程序全部删除。
本文轉自 劉園 51CTO部落格,原文連結:http://blog.51cto.com/colynn/1011482