1. 程式人生 > >第二十單元 計劃任務crond服務

第二十單元 計劃任務crond服務

 

什麼是計劃任務:
後臺執行,到了預定的時間就會自動執行的任務,前提是:事先手動將計劃任務設定好。這就用到了crond服務

crond服務相關的軟體包
[[email protected] ~]# rpm -qa |grep cron
cronie-anacron-1.4.11-14.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch
cronie-1.4.11-14.el7.x86_64

這些包在最小化安裝系統時就已經安裝了,並且會開機自啟動crond服務,併為我們提供好編寫計劃任務的crontab命令。

 

計劃任務分為兩類:系統級和使用者級

首先需要知道的是,無論是系統級還是使用者級的cron計劃都是文字檔案,系 統的計劃檔案存放在/etc/crontab路徑下。使用者的計劃檔案放在/var/spool/cron/使用者名稱,不管是哪一種,都可以滿足我們定製計劃任務的需求。

root使用者可以直接對檔案進行修改來編寫計劃任務也可以使用 crontab -e命令,而普通使用者只能使用後者。除此之外,系統crontab檔案中任務的定義也有所不同,在前五個部分之後插入了一個“使用者”部分。

[[email protected] ~]# cat /etc/crontab #檢視全域性計劃任務
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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
* * * * * root run-parts /test #run-parts命令,可以執行一個目錄下所有的可執行檔案,目錄下檔案必須有執行許可權

You have new mail in /var/spool/mail/root


[[email protected] ~]# crontab -u tom -l #通過命令檢視使用者tom的計劃任務
*/1 * * * * echo 123213123213


[[email protected] ~]# cat /var/spool/cron/tom #從檔案中檢視使用者tom的計劃任務
*/1 * * * * echo 123213123213

crontab命令編寫計劃任務

語  法:crontab [-u <使用者名稱稱>][配置檔案] 或 crontab [-u <使用者名稱稱>][-elr]

crontab任務配置基本格式:
*  *  *  *  *  command
分鐘(0-59) 小時(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  命令

第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要執行的命令

參  數: 
-e  編輯該使用者的計時器設定。 
-l  列出該使用者的計時器設定。 
-r  刪除該使用者的計時器設定。 
-u<使用者名稱稱>  指定要設定計時器的使用者名稱稱。

 

注意:

1 檢視計劃任務的執行:tail -f /var/log/cron

2 寫計劃任務時,命令必須加上絕對路徑,否則會出現這種情況:從日誌中看,確實觸發了計劃任務的執行,但是命令卻沒有執行成功,比如* * * * * reboot就會出現這種情況,需要將reboot寫成/usr/sbin/reboot

 

 

crontab例子:

30 21 * * * /usr/local/etc/rc.d/apache restart #每晚的21:30 重啟apache

45 4 1,10,22 * * /usr/local/etc/rc.d/apache restart #每月1、10、22日的4 : 45重啟apache

10 1 * * 6,0 /usr/local/etc/rc.d/apache restart #每週六、週日的1 : 10重啟apache

0,30 18-23 * * * /usr/local/etc/rc.d/apache restart #每天18 : 00至23 : 00之間每隔30分鐘重啟apache

0 23 * * 6 /usr/local/etc/rc.d/apache restart #每星期六的11 : 00 pm重啟apache

* 23-7/1 * * * /usr/local/etc/rc.d/apache restart #晚上11點到早上7點之間,每隔一個小時的每分鐘重啟 apache

0 */1 * * * /usr/local/etc/rc.d/apache restart #每一小時重啟apache

0 11 4 * mon-wed /usr/local/etc/rc.d/apache restart #每月的4號與每週一到週三的11點重啟apache

0 4 1 jan * /usr/local/etc/rc.d/apache restart #一月一號的4點重啟apache

*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 #每半小時同步一下時間

0 */2 * * * www /usr/bin/somecommand >> /dev/null 2>&1 #以使用者www的身份每兩小時就執行某個程式:


0 1 * * * /home/testuser/test.sh #每天1點呼叫/home/testuser/test.sh

*/10 * * * * /home/testuser/test.sh #每10鐘調用一次/home/testuser/test.sh

30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每天的21:30重啟lighttpd

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月1、10、22日的4 : 45重啟lighttpd

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart #每週六、週日的1 : 10重啟lighttpd

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart #上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重啟apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart #上面的例子表示每星期六的11 : 00 pm重啟lighttpd

* */2 * * * /usr/local/etc/rc.d/lighttpd restart #每兩小時的每分鐘重啟lighttpd

0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart #晚上11點到早上7點之間,每隔一小時重啟lighttpd

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart #每月的4號與每週一到週三的11點重啟lighttpd

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart #一月一號的4點重啟lighttpd

*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 #每半小時同步一下時間

對於一些常見的時間格式可以用如@yearly的方式代替

@reboot 代表的意思Run once, at startup.
@yearly 代表的意思Run once a year, "0 0 1 1 *".
@annually 與@yearly相同意思
@monthly 代表的意思Run once a month, "0 0 1 * *".
@weekly 代表的意思Run once a week, "0 0 * * 0".
@daily 代表的意思Run once a day, "0 0 * * *".
@midnight 與@daily的意思相同
@hourly 代表的意思Run once an hour, "0 * * * *".
除此之外,系統還有一些自帶的計劃任務

cron預設配置了排程任務,分別為:hourly、daily、weekly、mouthly,預設配置檔案為/etc/anacrontab

將需要執行的指令碼放到相應的目錄下即可,目錄分別為:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/ect/cron.mouthly

 

檢視cron服務是否起作用:

如果我們要檢視定時任務是否準時呼叫了可以/var/log/cron中的執行資訊

cat /var/log/cron

也可以用tail -f /var/spool/mail/使用者名稱,來檢視普通使用者的計劃任務執行情況

此處需要記住兩點:

第一:cron 守護程序每分鐘都檢查 /etc/crontab 檔案、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。如果發現了改變,它們就會被載入記憶體。這樣,當某個 crontab 檔案改變後就不必重新啟動守護程序了。

第二:crontab的使用者手冊中推薦每一個命令使用絕對路徑,例如呼叫rm命令時寫作:/bin/rm,這是為了防止由於每一個使用者的PATH環境變數不同而導致命令無法找到的錯誤。

網上查詢到的資料crontab不執行的問題:

轉自:http://blog.csdn.net/jbgtwang/article/details/7995801

第一,指令碼的原因:大多數情況下,我們要相信科學,相信計算機,不是有鬼,就是我們的指令碼的問題,這種問題導致crontab不能執行的概率佔到 70%以上。因為程式執行到某一步導致crontab終止執行,我就碰到一次在遷移程式碼的時候將資料庫連錯了。導致無法訪問而死在那裡了。

第二,執行環境問題,當我們碰到第一情況下,一般都可以通過手動執行程式將問題扼殺在搖籃裡,一般情況下高手是不應該犯第一種錯誤的。問題是當我們 手動執行成功而crontab不能執行的時候,筆者碰到一次就是執行環境的問題,例如相關路徑的設定問題。解決方案:在程式碼最前面執行 source /home/user/.bash_profile

第三,系統時間不正確。這種問題最好理解,也是比較常見和隱蔽的問題,解決方案:date -s ********

第四,就是我們的指令碼是否有可執行許可權。必須保證執行指令碼的使用者有執行改檔案的許可權。

第五,crontab 守護程序死掉了。這種情況是極少發生的,但也不排除,當我們實在是找不到其他原因的時候可以用。解決方案:重啟該程序。

第六,crontab不執行的問題困擾了好長時間,指令碼寫的都正確,但是就是不執行,最終解決方法如下:
crontab -u root /var/spool/cron/root
這樣root使用者的crontab就生效了
service crond restart
重啟下服務就好了

第七,crond沒有啟動

第八,指令碼編碼問題,指令碼在window下編寫,傳到linux下後報“鍩?!/bin/bash”,用vi編輯器新建新shell指令碼,輸入內容後儲存。

第九

* * * * * tar czf /tmp/`date '+%Y'` /etc 該計劃任務中命令的執行流程是crond->tar命令,而crond在執行tar命令時,無法識別萬用字元%的意思(shell能識別),所以該命令無法正常執行

改正結果:* * * * * tar czf /tmp/`date '+\%Y'` /etc

通常都會把要執行的操作放到檔案中,然後/bin/bash a.sh去執行,* * * * * /bin/bash a.sh  ,這樣的執行流程就變成了crond->bash shell->a.sh,這樣a.sh內即便是寫%號,也能被識別出來

 

 附件1 linux系統啟動流程

最初始階段
當我們開啟計算機電源,計算機會自動從主機板的BIOS(Basic Input/Output System)讀取其中所儲存的程式。這一程式通常知道一些直接連線在主機板上的硬體(硬碟,網路介面,鍵盤,串列埠,並口)。現在大部分的BIOS允許你從軟盤、光碟或者硬碟中選擇一個來啟動計算機。
下一步,計算機將從你所選擇的儲存裝置中讀取起始的512 bytes(比如光碟一開是的512 bytes,如果我們從光碟啟動的話)。這512 bytes叫做主引導記錄MBR (master boot record)。MBR會告訴電腦從該裝置的某一個分割槽(partition)來裝載引導載入程式(boot loader)。Boot loader儲存有作業系統(OS)的相關資訊,比如作業系統名稱,作業系統核心 (kernel)所在位置等。常用的boot loader有GRUB和LILO。
隨後,boot loader會幫助我們載入kernel。kernel實際上是一個用來操作計算機的程式,它是計算機作業系統的核心,主要的任務是管理計算機的硬體資源,充當軟體和硬體的介面。作業系統上的任何操作都要通過kernel傳達給硬體。Windows和Linux各自有自己kernel。狹義的作業系統就是指kernel,廣義的作業系統包括kernel以及kernel之上的各種應用。
(Linus Torvalds與其說是Linux之父,不如說是Linux kernel之父。他依然負責Linux kernel的開發和維護。至於Ubuntu, Red Hat, 它們都是基於相同的kernel之上,囊括了不同的應用和介面構成的一個更加完整的作業系統版本。)
實際上,我們可以在多個分割槽安裝boot loader,每個boot loader對應不同的作業系統,在讀取MBR的時候選擇我們想要啟動的boot loader。這就是多作業系統的原理。
小結:BIOS -> MBR -> boot loader -> kernel
kernel
如果我們載入的是Linux kernel,Linux kernel開始工作。kernel會首先預留自己執行所需的記憶體空間,然後通過驅動程式(driver)檢測計算機硬體。這樣,作業系統就可以知道自己有哪些硬體可用。隨後,kernel會啟動一個init程序。它是Linux系統中的1號程序(Linux系統沒有0號程序)。到此,kernel就完成了在計算機啟動階段的工作,交接給init來管理。
小結: kernel -> init process
init process
(根據boot loader的選項,Linux此時可以進入單使用者模式(single user mode)。在此模式下,初始指令碼還沒有開始執行,我們可以檢測並修復計算機可能存在的錯誤)
隨後,init會執行一系列的初始指令碼(startup scripts),這些指令碼是Linux中常見的shell scripts。這些指令碼執行如下功能:
設定計算機名稱,時區,檢測檔案系統,掛載硬碟,清空臨時檔案,設定網路……
當這些初始指令碼,作業系統已經完全準備好了,只是,還沒有人可以登入!!!init會給出登入(login)對話方塊,或者是圖形化的登入介面。

輸入使用者名稱(比如說vamei)和密碼,DONE!
在此後的過程中,你將以使用者(user)vamei的身份操作電腦。此外,根據你建立使用者時的設定,Linux還會將你歸到某個組(group)中,比如可以是stupid組,或者是vamei組。
所以你將是使用者vamei, 同時是vamei組的組員。(注意,組vamei和使用者vamei只是重名而已,就好想你可以叫Dell, 同時還是Dell公司的老闆一樣。你完全也可以是使用者vamei,同時為stupid組的組員)
總結
BIOS -> MBR -> boot loader -> kernel -> init process -> login
使用者,組