【Linux】週期任務crontab
阿新 • • 發佈:2018-12-26
crond和crontab的區別
crond是一個指令,而crontab是一個檔案,用於存放指令的檔案 crond的概念和crontab是不可分割的。 crontab是一個命令,常見於Unix和類Unix的作業系統之中,用於設定週期性被執行的指令。 該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。而crond正是它的守護程序。簡介
crond 是Linux下用來週期性的執行某種任務或等待處理某些事件的一個守護程序,與windows下的計劃任務類似,當安裝完成作業系統後,預設會安裝此服務工具,並且會自動啟動crond程序,crond程序每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。Linux下的任務排程的分類
(1)系統任務排程
系統週期性所要執行的工作,比如寫快取資料到硬碟、日誌清理等。在/etc目錄下有一個crontab檔案,這個就是系統任務排程的配置檔案。(2)使用者任務排程
使用者定期要執行的工作,比如使用者資料備份、定時郵件提醒等。使用者可以使用 crontab 工具來定製自己的計劃任務。所有使用者定義的crontab 檔案都被儲存在 /var/spool/cron目錄中。其檔名與使用者名稱一致。使用者許可權檔案:
檔案:/etc/cron.deny 該檔案中所列使用者不允許使用crontab命令
檔案:/etc/cron.allow 該檔案中所列使用者允許使用crontab命令
檔案:/var/spool/cron/ 所有使用者crontab檔案存放的目錄,以使用者名稱命名
crontab檔案
使用者所建立的crontab檔案中,每一行都代表一項任務,每行的每個欄位代表一項設定,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:minute hour day month week command
星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。
用法
使用crontab 命令新增或者編輯需要定時執行的任務
命令格式
crondtab [-u user] file/-l/-r/-e命令引數
-u user:用來設定某個使用者的crontab服務,例如,“-u ixdba”表示設定ixdba使用者的crontab服務,此引數一般有root使用者來執行。 file:file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入crontab。如果在命令列中沒有指定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。 -e:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。-l:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。
-r:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。
-i:在刪除使用者的crontab檔案時給確認提示。
常用方法
1). 建立一個新的crontab檔案
在 考慮向cron程序提交一個crontab檔案之前,首先要做的一件事情就是設定環境變數EDITOR。cron程序根據它來確定使用哪個編輯器編輯 crontab檔案。9 9 %的UNIX和LINUX使用者都使用vi,如果你也是這樣,那麼你就編輯$ HOME目錄下的. profile檔案,在其 中加入這樣一行:EDITOR=vi; export EDITOR
然後儲存並退出。不妨建立一個名為<user> cron的檔案,其中<user>是使用者名稱,例如, davecron。在該檔案中加入如下的內容。
# (put your own initials here)echo the date to the console every
# 15minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console
儲存並退出。確信前面5個域用空格分隔。
在 上面的例子中,系統將每隔1 5分鐘向控制檯輸出一次當前時間。如果系統崩潰或掛起,從最後所顯示的時間就可以一眼看出系統是什麼時間停止工作的。在有些 系統中,用tty1來表示控制檯,可以根據實際情況對上面的例子進行相應的修改。為了提交你剛剛建立的crontab檔案,可以把這個新建立的檔案作為 cron命令的引數:
$ crontab davecron
現在該檔案已經提交給cron程序,它將每隔1 5分鐘執行一次。
同時,新建立檔案的一個副本已經被放在/var/spool/cron目錄中,檔名就是使用者名稱(即dave)。
2). 列出crontab檔案
為了列出crontab檔案,可以用:$ crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1
你將會看到和上面類似的內容。可以使用這種方法在$ H O M E目錄中對crontab檔案做一備份:
$ crontab -l > $HOME/mycron
這樣,一旦不小心誤刪了crontab檔案,可以用上一節所講述的方法迅速恢復。
3). 編輯crontab檔案
如果希望新增、刪除或編輯crontab檔案中的條目,而E D I TO R環境變數又設定為v i,那麼就可以用v i來編輯crontab檔案,相應的命令為:$ crontab -e
可以像使用v i編輯其他任何檔案那樣修改crontab檔案並退出。如果修改了某些條目或添加了新的條目,那麼在儲存該檔案時, c r o n會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許範圍的值,它會提示你。
我們在編輯crontab檔案時,沒準會加入新的條目。例如,加入下面的一條:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;
現在儲存並退出。最好在crontab檔案的每一個條目之上加入一條註釋,這樣就可以知道它的功能、執行時間,更為重要的是,知道這是哪位使用者的作業。
現在讓我們使用前面講過的crontab -l命令列出它的全部資訊:
$ crontab -l
# (crondave installed on Tue May 4 13:07:43 1999)
# DT:ech the date to the console every 30 minites
0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;
4). 刪除crontab檔案
要刪除crontab檔案,可以用:$ crontab -r
5). 恢復丟失的crontab檔案
如果不小心誤刪了crontab檔案,假設你在自己的$ H O M E目錄下還有一個備份,那麼可以將其拷貝到/var/spool/cron/<username>,其中<username>是使用者名稱。如果由於許可權問題無法完成拷貝,可以用:$ crontab <filename>
其中,<filename>是你在$ H O M E目錄中副本的檔名。
我建議你在自己的$ H O M E目錄中儲存一個該檔案的副本。我就有過類似的經歷,有數次誤刪了crontab檔案(因為r鍵緊挨在e鍵的右邊)。這就是為什麼有些系統文件建議不要直接編輯crontab檔案,而是編輯該檔案的一個副本,然後重新提交新的檔案。
有些crontab的變體有些怪異,所以在使用crontab命令時要格外小心。如果遺漏了任何選項,crontab可能會開啟一個空檔案,或者看起來像是個空檔案。這時敲delete鍵退出,不要按<Ctrl-D>,否則你將丟失crontab檔案。
使用例項
例項1:每天早上7點執行一次 /bin/ls :0 7 * * * /bin/ls例項2:晚上11點到早上8點之間每兩個小時,早上8點:0 23-7/2,8 * * * date
例項3:每天早上6點10分:10 6 * * * date
例項4:每兩個小時:0 * / 2 * * * date
例項5:晚上11點到早上8點之間每兩個小時,早上8點:0 23-7/2,8 * * * date
例項6:每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點:0 11 4 * mon-wed date
例項7:1月份日早上4點:0 4 1 jan * date
linux系統的管理員經常用到crontab的例子 :
在 12 月內, 每天的早上 6 點到 12 點中,每隔3個小時執行一次 /usr/bin/backup :0 6-12/3 * 12 */usr/bin/backup
每晚的21:30重啟apache:30 21 * * * /etc/init.d/apache2 restart
每月1、10、22日的4 : 45重啟apache:45 4 1,10,22 * * /etc/init.d/apache2 restart
每週六、週日的1 : 10重啟apache:10 1 * * 6,0 /etc/init.d/apache2 restart