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