Linux之任務(wù)計(jì)劃 crontab
Linux之任務(wù)計(jì)劃
用過windows的同學(xué)應(yīng)該都知道在控制面板中有一個(gè)“任務(wù)計(jì)劃”選項(xiàng),我們可以通過向?qū)гO(shè)置讓計(jì)算機(jī)在某個(gè)時(shí)間點(diǎn)或者開機(jī)時(shí)運(yùn)行某個(gè)腳本或者批處理等等,方便我們的日常管理監(jiān)視工作;同樣在Linux系統(tǒng)中,如果我們想在開機(jī)時(shí)就運(yùn)行某個(gè)操作,可以直接將命令寫入/etc/rc.local中,該操作就會在機(jī)器開機(jī)時(shí)運(yùn)行;如果把自己寫的Bash Shell腳本的名稱寫在/etc/rc.local中,開機(jī)后也會執(zhí)行其操作;也就是說,在Linux啟動(dòng)的最后階段,系統(tǒng)會執(zhí)行存于rc.local中的命令;類似于windows里面的“啟動(dòng)”菜單。如果想在Linux中定時(shí)去執(zhí)行某些操作呢?我們可以使用at ,batch ,crontab , anacron等命令;
一、一次性執(zhí)行任務(wù)命令at、batch
說白了就是任務(wù)只執(zhí)行一次,就結(jié)束操作,不會循環(huán)執(zhí)行其操作。
-
使用方式:at [-v][-q queue][-f file][-mldbv] TIME
說明:at可以讓使用者指定在TIME這個(gè)特定時(shí)刻執(zhí)行某個(gè)程序或指令,TIME的格式是HH:MM其中HH為小時(shí),MM為分鐘。如果想要指定超過一年內(nèi)的時(shí)間,則可以使用MMDDYY或者MM/DD/YY的格式,其中MM是分鐘,DD是第幾天,YY是指年份。另外,也可以使用想now+時(shí)間間隔來指定時(shí)間,其中的時(shí)間間隔可以為minutes ,hours ,days ,weeks.例如now+3days;也可以指定today或tomorrow來表示今天或明天。當(dāng)指定了時(shí)間并按下enter之后,at會進(jìn)入交互模式并要求輸入指令或程序,當(dāng)輸入完成后按ctrl+D即可完成。執(zhí)行結(jié)果會通過郵件發(fā)送給執(zhí)行程序的賬戶。
-
參數(shù)說明
-V :出版編號
-q:使用指定queue來存儲,at的資料存放在所謂的queue中,使用者可以同時(shí)使用多個(gè)queue,而queue的編號為a,b,c…..z以及A,B,C……Z共52個(gè);
-m:不管程序指令執(zhí)行完后有沒有輸出結(jié)果,都發(fā)郵件給使用者
-f file:讀入預(yù)先寫好的命令文檔??梢詫⑺械拿钕葘懭胛臋n在一次讀入;
-l:列出所有at任務(wù);或者atq;
-d:刪除at任務(wù),或者使用atrm;
-v:列出所有已經(jīng)完成但尚未刪除的指定;
3、實(shí)例:指定今天下午5:30執(zhí)行某個(gè)命令,今天是2015年5月17日中午12點(diǎn)其格式如下:
at 5:30pm
at 17:30
at 17:30 today
at now + 5 hours
at now + 300 minutes
at 17:30 17.5.15
at 17:30 5/17/2015
at 17:30 May 17
實(shí)例2:at指定一個(gè)任務(wù),在當(dāng)前時(shí)間一分鐘后執(zhí)行,顯示/etc/issue中的內(nèi)容;
實(shí)例3:先創(chuàng)建一個(gè)文檔work,放入預(yù)先執(zhí)行的命令,然后用at –f work TIME去執(zhí)行;
-
at的執(zhí)行權(quán)限:
在任何情況下,root用戶都有執(zhí)行權(quán)限;
對其他用戶來說,是否能夠使用取決于兩個(gè)文檔/etc/at.allow和/etc/at.deny
如果/etc/at.allow文檔存在的話,那么只有在其中列出的用戶在能夠使用at
如果該文檔不存在,那么將檢查/etc/at.deny文檔是否存在,在這個(gè)文檔中列出的用戶均不能使用該命令;
假如兩個(gè)文檔都不存在,那么只有中級用戶能夠使用該命令;
空的/etc/at.deny文檔意味著所有的用戶都能夠使用該命令,這是系統(tǒng)默認(rèn)狀態(tài).
-
batch命令同at命令,但無須為其指定時(shí)間,其會選擇系統(tǒng)資源空閑時(shí)執(zhí)行指定的作業(yè)。
-
mail命令(Linux收發(fā)郵件使用方法)
在終端中輸入命令mail,回車,如果有郵件會顯示出來有幾封,如果沒有會提示no mail for user;輸入mail后進(jìn)入&模式,此時(shí)可以輸入想要查看的郵件編號數(shù)字來查看內(nèi)容,如果想要?jiǎng)h除某個(gè)郵件可以使用d #命令,按q保存退出,按x不保存退出;
兩種發(fā)郵件的方法:
mail –s “subject” username </etc/fstab
echo “subject” | mail –s “content” username
默認(rèn)系統(tǒng)會安裝并啟動(dòng)郵件服務(wù);25號端口,可以使用netstat –tnl /tan 查看25號端口smtp協(xié)議是否運(yùn)行 ;有的系統(tǒng)可能默認(rèn)沒有安裝郵件系統(tǒng),此時(shí)需要安裝sendmial包即可;
二、周期性執(zhí)行任務(wù)命令crontab(重點(diǎn))
相比用于安排一次性任務(wù)的at命令,crontab命令主要是用于安排一些周期性的任務(wù),比如 定期備份數(shù)據(jù)、定時(shí)殺毒、定期清理垃圾文件等。 Linux中的cron進(jìn)程是一個(gè)主要的系統(tǒng)調(diào)度進(jìn)程,可以在后臺自動(dòng)完成用戶指定的任務(wù) 計(jì)劃。它每分鐘檢查一遍各個(gè)用戶的“”任務(wù)計(jì)劃書“”--也就是crontab文件,如果計(jì)劃書中所指定的運(yùn)行條件滿足,就立即為用戶執(zhí)行計(jì)劃書中的任務(wù)。在centos5以前的版本叫做vixie-cron,在centos6以后的版本叫作cronie,在運(yùn)行前使用rpm –qa | grep “cron” 來查看系統(tǒng)是否已經(jīng)安裝;可以通過service crond status查看狀態(tài),service crond start ,chkconfig crond on 啟動(dòng)服務(wù),設(shè)置開機(jī)自動(dòng)啟動(dòng);
Cron任務(wù)分兩類:一類是系統(tǒng)cron:定義在/etc/crontab中,一類是用戶cron:定義在/var/spool/cron中,目錄中每個(gè)用戶都有一個(gè)與用戶名相同的文件,其功能類似于/etc/crontab;每行定義一個(gè)獨(dú)立的任務(wù);
-
crontab命令使用方法
crontab [-e [username] | -l [username] | -r [username] | -v [username] | File ]
說明:crontab是用來讓使用者在固定時(shí)間或固定間隔執(zhí)行程序之用,換句話說就是類似使用者的時(shí)程表。
-u username 是指定username的時(shí)程表,這個(gè)前提是你必須要有其權(quán)限,比如root才能夠指定他人的時(shí)程表,如果不使用-u user的話,就是表示設(shè)定自己的時(shí)程表。
Crontab –l:列出某個(gè)用戶cron服務(wù)的詳細(xì)內(nèi)容
Crontab –e:編輯某個(gè)用戶的cron服務(wù);
-
crontab的格式
# 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
說明:當(dāng)使用crontab -e編輯當(dāng)前用戶的cron表后,會出現(xiàn)一個(gè)vi文件,cron的格式是這樣的。分成兩列,左邊是時(shí)間,右邊是運(yùn)行的命令。時(shí)間是由5個(gè)部分組成。如果執(zhí)行的命令太多,可以把這些命令寫到一個(gè)腳本里面,然后再直接調(diào)用這個(gè)腳本,調(diào)用的時(shí)候?qū)懗雒畹耐暾窂健?/span>
時(shí)間的設(shè)定有一定的要求,前面5個(gè)*代表5個(gè)數(shù)字,數(shù)字的取值范圍和含義如下:
分鐘(0-59)小時(shí)(0-23)日期(1-31)月份(1-12)星期(0-6)0和7都表示星期天
除了數(shù)字還有幾個(gè)特殊的符號就是“*”“/”“-”“,”,*代表所有的取值范圍內(nèi)的數(shù)字,/代表每的意思,*/5代表每5個(gè)單位,-代表從某個(gè)數(shù)字到某個(gè)數(shù)字,“,”分開幾個(gè)離散的數(shù)字。
例子1: 0 8 5 6 * command 表示每6月5日的8點(diǎn)整執(zhí)行命令;
例子2: 10,30,50 * * * * date 表示每小時(shí)的10分,30分,50分顯示時(shí)間
例子3: 0 6 * * * * echo “good morning” >>/tmp/test.xt 每天早上6點(diǎn)執(zhí)行,注意單純的echo從屏幕上看不到任何輸出,因?yàn)?/span>cron把任何輸出都會通過mail發(fā)送給用戶;
例子4: 0 */2 * * * echo “hi” 每兩個(gè)小時(shí)執(zhí)行一次;
例子5: 0 11 4 * 1-3 command 表示每個(gè)月的4號和每個(gè)禮拜的1到3的早上11點(diǎn)執(zhí)行
3、通常,系統(tǒng)并不允許用戶直接編輯計(jì)劃書,/var/spool/cron/crontabs目錄也只有root用戶才可讀寫。為了方便計(jì)劃書的管理,系統(tǒng)提供了crontab命令:crontab -u username –e;
補(bǔ)充說明:
3.1. 環(huán)境變量,cron進(jìn)程執(zhí)行任務(wù)時(shí),并不加載計(jì)劃書所屬用戶的環(huán)境變量,只加載幾個(gè)最基本的環(huán)境變量,比如執(zhí)行任務(wù)的sh,$HOME,$MAILTO等。這幾個(gè)環(huán)境變量的定義是在 /etc/crontab文件中。其中$MAILTO是指定計(jì)劃執(zhí)行過程中發(fā)生錯(cuò)誤或者有數(shù)據(jù)輸出時(shí)發(fā) 送郵件到哪個(gè)用戶。通常會在腳本中加入. /etc/profile 或者. ~/.bash_profile即可。
3.2. 不能運(yùn)行crontab命令或者計(jì)劃沒有被執(zhí)行,crontab的權(quán)限設(shè)置是由兩個(gè)文件來決定的 :/etc/cron.allow, /etc/cron.deny。如果存在/etc/cron.allow,則把要執(zhí)行計(jì)劃的 用戶名稱添加到其中;若/etc/cron.deny存在,則確保要執(zhí)行計(jì)劃的用戶名稱不在 /etc/cron.deny中;如果兩個(gè)文件都存在,/etc/cron.allow優(yōu)先。
3.3. 計(jì)劃書的輸出和日志,如果用戶的計(jì)劃書在運(yùn)行時(shí)有輸出,用戶是無法直接從終端上看 到的。cron進(jìn)程會將執(zhí)行計(jì)劃時(shí)產(chǎn)生的所有輸出數(shù)據(jù)和錯(cuò)誤信息發(fā)送到指定用戶的郵箱 ,用戶可到郵箱中去查看,所以建議在計(jì)劃中把有用的輸出數(shù)據(jù)重定向到文件中。要想 查看各個(gè)計(jì)劃的執(zhí)行情況,可以查看cron進(jìn)程的日志文件:/var/log/cron。
3.4. 更簡單的任務(wù)計(jì)劃, 如果覺得這樣麻煩,還有一種簡單的方法。/etc下面有4個(gè)目錄: cron.hourly,cron.daily,cron.weekly,cron.weekly,這4個(gè)目錄下腳本的執(zhí)行周期 分別是每小時(shí),每天,每周,每月。根據(jù)自己的需要,將要運(yùn)行的腳本直接放置到對應(yīng) 的目錄下即可,系統(tǒng)會自動(dòng)為你完成任務(wù)。
3.5.使用注意事項(xiàng):每月幾號和周幾一般不同時(shí)使用,如 1 9 * * 3 :表示每周三執(zhí)行一次;
Crontab –e 打開編輯界面定義任務(wù)時(shí)先啟用臨時(shí)文件,如果剛到此時(shí)間點(diǎn)執(zhí)行而沒有編輯會怎么樣?
4、anacron: crontab的補(bǔ)充機(jī)制,檢查有沒有過去的一個(gè)有效周期未曾執(zhí)行的任務(wù),如果有,在開機(jī)后的指定時(shí)間點(diǎn)執(zhí)行一次;這個(gè)是系統(tǒng)設(shè)置好了,清理系統(tǒng)垃圾或者是自動(dòng)執(zhí)行某些腳本的系統(tǒng)任務(wù),一般我們做了解就行了,不要更改。配置文件是/etc/anaconrtab。
以上是自己總結(jié)的一些心得體會,任務(wù)計(jì)劃是實(shí)現(xiàn)自動(dòng)化運(yùn)維的重要命令,希望大家重視,如有問題請多指點(diǎn)。