計劃任務工具 cron 的配置和說明

tonywi888發表於2007-07-11

目錄


++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++


1、計劃任務概說;

計劃任務,是任務在約定的時間執行已經計劃好的工作,這是表面的意思。在Linux中,我們經常用到 crond 伺服器來完成這項工作。cron伺服器可以根據配置檔案約定的時間來執行特定的作務。比如我們可以在配置檔案中約定每天早上4點,對httpd 伺服器重新啟動,這就是一個計劃任務;

下面我們先來說說cron;


2、cron;

在Linux系統中,計劃任務一般是由cron承擔,我們可以把cron設定為開機時自動啟動。cron啟動後,它會讀取它的所有配置檔案(全域性性配置檔案/etc/crontab,以及每個使用者的計劃任務配置檔案),然後cron會根據命令和執行時間來按時來呼叫度工作任務。


2.1 cron 的安裝和啟動;

在一般情況下,cron都是系統預設安裝的,我們要學會檢視軟體包是否已經安裝;


2.1.1 在Redhat 或 Fedora等RPM包管理的系統的安裝;

判斷系統是否已經安裝cron相關的包

Fedora 5.0 系統的情況;

其它版本的Fedora及Redhat的系統和這相似;

[root@localhost ~]# rpm -qa |grep cron
vixie-cron-4.1-54.FC5
anacron-2.3-36.1
crontabs-1.10-7.1

其中vixie-cron軟體包是cron的主程式,您可以透過下面的命令來了解它,其它軟體包同理;

[root@localhost beinan]# rpm -ql vixie-cron

crontabs 軟體包是用來安裝、卸裝、或列舉用來驅動 cron 守護程式的表格的程式。cron 守護程式檢查 crontab 檔案來檢視某個指定命令被排程執行的時間。如果命令已經排程,守護程式就會執行它們。瞭解crontabs軟體包都安裝了些什麼,應該用下面的命令;

[root@localhost beinan]# rpm -ql crontabs

如果沒有安裝,可以從光碟中找出檔名帶有cron字樣的軟體包來安裝。

[root@localhost ~]# rpm -ivh vixie-cron-4.1-54.FC5*
[root@localhost ~]# rpm -ivh crontabs*

也可以用yum 來線上安裝;

[root@localhost ~]# yum install vixie-cron
[root@localhost ~]# yum install crontabs


2.1.2 在Slackware系統中的安裝;

在Slackware中cron軟體包是 dcron,您可以在光碟中找出來安裝它;

檢視是否已經安裝了dcron軟體包,您可以這樣檢視。在這裡能列出軟體包詳細的安裝情況;

[root@localhost ~]# more /var/adm/packages/dcron*

如果沒有安裝,請用下面的命令來安裝。在第一張安裝盤中找出dcron軟體包;

[root@localhost ~]# installpkg dcron*.tgz


2.1.3 cron 的開啟、停止、重新啟動方法;

cron配置檔案被修改後,想讓新檔案生效,必須重新crond伺服器,有兩種方法可供選擇;


第一種 在Fedora或Redhat 等以RPM包管理的系統中;

[root@localhost ~]# /etc/init.d/crond start
[root@localhost ~]# /etc/init.d/crond stop
[root@localhost ~]# /etc/init.d/crond restart

如果想在Fedora 和 Redhat 或以這些發行版為基礎克隆的發行版,如果想自動開機執行,請用下面的辦法;

[root@localhost ~]# chkconfig --levels 35 crond on

第二種:通用

[root@localhost ~]# pgrep crond 注:判斷crond 是否在執行;
[root@localhost ~]# pkill crond 注:殺掉正在執行中的crond;
[root@localhost ~]# pgrep crond 注:檢視是否被殺掉了;
[root@localhost ~]# /usr/sbin/crond 注:執行crond;


2.2 cron 配置檔案;

cron 是一個伺服器程式,我們都知道Linux的伺服器的配置,大多是透過配置檔案來完成的,cron自然也不例外,在Redhat/Fedora 等系統中它的全域性性配置檔案是/etc/crontab;在Slackware系統中,全域性性檔案是/var/spool/cron/crontabs/root 。每個使用者也有自己的cron配置檔案,我們可以透過crontab -e 來編輯它;


2.2.1 全域性性配置檔案;

下面是一個全域性性的配置檔案例子,以Fedora Core 5為例;

[root@localhost ~]# more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
1 * * * * root run-parts /etc/cron.hourly
#
2 4 * * * root run-parts /etc/cron.daily
#
22 4 * * 7 root run-parts /etc/cron.weekly
#
42 4 1 * * root run-parts /etc/cron.monthly
#
0,5,10,15,20,25,30,35,40,45,50,55 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

對於全域性性配置檔案,我們要用root許可權來更改,一般是透過crontab -e 來修改。但有時也並不一定是這樣的,比如Fedora Core 5 如果透過crontab -e 修改的是root使用者的cron 配置檔案。所以我們要在Fedora Core 5中修改全域性性配置檔案可以用vi 編輯器來修改。vi的用法請參考:

在全域性性配置檔案中,定義了可執行命令的路徑環境變數,所用SHELL型別的定義等,這些大多不用修改;我們經常新增的是計劃任務或修改任務執行的時間等;

在全域性性配置檔案中,我們發現有類似這些行;

1 * * * * root run-parts /etc/cron.hourly 注:表示每個小時的第一分鐘,開始執行/etc/hourly目錄下的可執行程式或指令碼;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4點2分,開始執行/etc/cron.daily目錄下的可執行程式或指令碼;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7個周4點我22分,開始執行 /etc/cron.weekly目錄下的可執行程式或指令碼;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4點42分,開始執行/etc/cron.monthly目錄下的可執行程式或指令碼;

這些行是用來在同一時間批次執行任務的,我們在以後的例子中獨立出來解說,在這裡只是讓大家心中有數;


2.2.2 cron 配置計劃任務的書寫格式

分鐘 小時 日 月 周 [使用者名稱] 命令

說明:

第一段應該定義的是:分鐘,表示每個小時的第幾分鐘來執行。範圍是從0-59
第二段應該定義的是:小時,表示從第幾個小時來執行,範圍是從0-23
第三段應該定義的是:日期,表示從每個月的第幾天執行,範圍從1-31
第四段應該定義的是:月,表示每年的第幾個月來執行,範圍從1-12
第五段應該定義的是:周,表示每週的第幾天執行,範圍從0-6,其中 0表示星期日。
每六段應該定義的是:使用者名稱,也就是執行程式要透過哪個使用者來執行,這個一般可以省略;
第七段應該定義的是:執行的命令和引數。

注:其中使用者名稱可是省略,使用者名稱定義的是程式用哪個使用者來執行,比如mysql伺服器,我們可以定義成以mysql使用者來啟動、停止、重新啟動,這時要寫上使用者名稱;不過對於cron來說意義不是太大,因為每個使用者都有自己的cron配置檔案。有些程式的啟動必須用到root使用者,這時我們就可以修改root使用者的cron配置檔案就行了。在每個使用者的配置檔案中,不必指定使用者名稱。

我們可以把計劃任務寫在全域性性配置檔案中,如果您想把一個計劃放入全域性性配置檔案中,就得改發行版所對應的cron全域性配置檔案,比如Fedora 5的全域性性配置檔案是/etc/crontab檔案;

每個使用者也能定義自己的cron配置檔案,用crontab -e 命令來定義;

舉一例:讓機器在每天8點30分重新啟動;

關於時間格式中有7個欄位。我們可以直接更改或者新增,當然這是系統任務呼叫。舉個例子,比如我在每天的早上8點30分重新啟動機器,就可以在
/etc/crontab中加入下面的兩句,第一句就是註釋了。以#號開始,後面寫一個自己能知道這是什麼任務的備註;

# reboot OS
30 8 * * * root /sbin/reboot

第一段應該定義的是:分鐘,表示每個小時的第幾分鐘來執行。範圍是從0-59
第二段應該定義的是:小時,表示從第幾個小時來執行,範圍是從0-23
第三段應該定義的是:日期,表示從每個月的第幾天執行,範圍從1-31
第四段應該定義的是:月,表示每年的第幾個月來執行,範圍從1-12
第五段應該定義的是:周,表示每週的第幾天執行,範圍從0-6,其中 0表示星期日。
每六段應該定義的是:使用者名稱,也就是執行程式要透過哪個使用者來執行,這個一般可以省略;
第七段應該定義的是:執行的命令和引數。

對比上面的例子就知道,30是不是分鐘??8是不是小時?如果有*代表的地方,表示全部,也就是說,每個月,每天,每星期都要執行。root 表示用root使用者執行,命令是/sbin/reboot ,也就是說,系統在每天 8點30分重新啟動;

我們可以把每天8點30分重新啟動的計劃任務寫入cron全域性性配置檔案中,也可以定義在root使用者自己的cron配置檔案中。如果定義在root自己的配置檔案,請用root身份來執行 crontab -e 來修改配置檔案;crontab -e 進入修改配置檔案的過程,其實和vi的用法一樣,請參看vi 的用法:

讓配置檔案生效:如果讓配置檔案生效,還得重新啟動cron,切記,既然每個使用者下的cron配置檔案修改後。也要重新啟動cron伺服器。

在Fedora 和Redhat中,我們應該用;

[root@localhost ~]# /etc/init.d/crond restart

如果讓crond 在開機時執行,應該改變其執行級別;

[root@localhost ~]# chkconfig --levels 35 crond on

在Slackware中,如果開機自動執行;

檢視/etc/rc.d/rc.M檔案是否有如的行,如果沒有就加上,大多是有的;

# Start crond (Dillon's crond):
if [ -x /usr/sbin/crond ]; then
/usr/sbin/crond -l10 >>/var/log/cron 2>&1


如果想讓立即讓cron重啟生效,也可以用下面的辦法;


[root@localhost ~]# pgrep crond 注:檢視crond伺服器是否執行;
2022
[root@localhost ~]# pkill crond 注:殺死crond;
[root@localhost ~]# pgrep crond 注:檢視crond是否退出;
[root@localhost ~]# /usr/sbin/crond 注:啟動crond;
[root@localhost ~]# pgrep crond 注:檢視crond 是否已經執行得起來了;
3883


2.2.3 關於同一時間,同時執行多個任務的定義方法;

我們在前面已經說過,在全域性性配置檔案中,有類似如下的段落;

1 * * * * root run-parts /etc/cron.hourly 注:表示每個小時的第一分鐘,開始執行/etc/hourly目錄下的可執行程式或指令碼;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4點2分,開始執行/etc/cron.daily目錄下的可執行程式或指令碼;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7個周4點我22分,開始執行 /etc/cron.weekly目錄下的可執行程式或指令碼;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4點42分,開始執行/etc/cron.monthly目錄下的可執行程式或指令碼;

舉例來說,我想在每天5點10分來重新啟動httpd 伺服器,與此同時,我們也可以同時下載一個ISO檔案。如果我們按書寫計劃任務的規則一條一條的來書寫,並新增到全域性是有點麻煩。不如寫一個指令碼放在/etc/crond.daily目錄中。然後把其許可權設定為755 (關於許可權的設定,請參考:)。

當然我們得改一改上面的 帶有/etc/cron.daily那行,改為如下;

10 5 * * * root run-parts /etc/cron.daily

然後我們到/etc/crond.daily目錄中建立兩個檔案,一個是用來重啟httpd伺服器的,如下;

[root@localhost cron.daily]# touch httpd.sh
[root@localhost cron.daily]# chmod 755 httpd.sh
[root@localhost cron.daily]# echo "/etc/init.d/httpd restart" > httpd.sh
[root@localhost cron.daily]# more httpd.sh
/etc/init.d/httpd restart

如果我想在每天5點20分下載FC5的映象,可以再建立一個檔案fc5down.sh

[root@localhost cron.daily]# touch fc5down.sh
[root@localhost cron.daily]# chmod 755 fc5down.sh
[root@localhost cron.daily]# echo "/usr/bin/wget > fc5down.sh
[root@localhost cron.daily]# more fc5down.sh
/usr/bin/wget

然後我們重新啟動一下crond就行了;

[root@localhost cron.daily]# pkill crond
[root@localhost cron.daily]# prep crond
[root@localhost cron.daily]# crond&

注意:我只是想說明一下,在同一時間 執行多個計劃任務的簡單用法,並不是有意教給您每天早上都下載FC5的映像。我舉這個例子是為了初學者瞭解這個功能。如果您有好多的任務在某一時刻執行,那就自己寫指令碼檔案。放在/etc目錄下的cron.hourly 、cron.daily 、cron.weekly 、cron.monthly 目錄中。凡是放進這些目錄的可執行指令碼,都能在約定的時間內準確執行。每個目錄有每個目錄的用途;


2.2.4 對於使用者自身的cron 配置檔案的說明;

每個使用者都有自己的cron配置檔案,透過crontab -e 就可以編輯,一般的情況下,在Fedora和Redhat的發行版,我們編輯好使用者的cron配置檔案儲存退出後,系統會自動就存放於/var/spool/cron/目錄中,檔案以使用者名稱命名。在Slackware中是位於/var/spool/cron/crontabs/目錄中。其它的發行版都差不多,有點類似。自己找找吧;檢視使用者的計劃任務是crontab -l

crontab -e 注:編輯使用者的cron配置檔案;
crontab -l 注:檢視使用者的計劃任務;

比如我用beinan使用者來執行crontab -e ;

[beinan@localhost ~]$ id 注:判斷所用使用者身份;
uid=500(beinan) gid=500(beinan) groups=500(beinan)
[beinan@localhost ~]$ crontab -e 注:編輯使用者beinan的計劃任務;

我們在裡面定義一個任務;

40 20 * * * /usr/bin/wget

儲存退出後,我們用下面的命令來檢視beinan使用者的計劃任務;

[beinan@localhost ~]$ crontab -l
40 20 * * * /usr/bin/wget

配置好後,我們還要重新啟動crond伺服器,每個使用者cron配置檔案的改動都得重新啟動crond伺服器;前面已經說過了,這裡省略;值得注意的是重啟crond伺服器,需要root許可權,您可以用su命令切換到root 使用者,然後再來重啟crond;


在Fedora或Redhat等以RPM包管理的發行版中;

[beinan@localhost ~]$ su
口令:
[root@localhost beinan]# /etc/init.d/crond restart
停止 crond: [確定]
啟動 crond: [確定]


也可以先殺死crond,再執行crond命令的辦法來啟動;

[root@localhost beinan]# pkill crond
[root@localhost beinan]# pgrep crond
[root@localhost beinan]# /usr/sbin/crond
[root@localhost beinan]# pgrep crond
6664


3、計劃任務的應用範圍;

計劃任務主要是讓系統自動完成一些工作。比如我們可以讓系統自動在某一時刻清理或備份httpd伺服器的日誌,然後重新啟動httpd伺服器,這對網路管理員來說是很重要的。也可以讓系統自動清空位於/tmp目錄的垃圾檔案。

另外值得一提的是,LinuxSir.Org 有很多子站,每個子站都有RSS,能讓這些站點的RSS相互投遞,也是用cron來完成,比如是在早上4點左右開始執行這個任務。這是一個極為耗費資源的過程,如果不是放在線上人少的時候,基本無法完成,所以只能放在早上進行。作為SIR的管理員,不可能每天早上4點起來點滑鼠來完成這些事吧。所以最好的辦法就是透過cron來自動執行,以在伺服器最清閒的時候來完成這項工作;


4、關於本文;

本文是關於計劃任務的,本來想把有關計劃任務的內容都寫在一個文件中,由於在寫文件之前沒有準備好,所以只寫了一個cron ;本文可能會在近期調整一下,加入at等工具的用法等;


5、後記;

這篇後記不用寫了,我在本文件修改期間寫了程式管理的文件;

有一件趣事得提一提,昨天檢視lumaqq.inuxsir.org 的 google 廣告收入,目前大約是70$左右,這個廣告帳戶,目前我是代luma兄管理的。現在看來廣告是比較少。。。。。從一月份到現在,半年快過去了,才僅僅 70$。


6、參考文件;




7、相關文件;



似乎有個錯誤?

在2.2.3 中22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7個周4點我22分,開始執行 /etc/cron.weekly目錄下的可執行程式或指令碼;
似乎應該為:
22 4 * * 0 root run-parts /etc/cron.weekly 注:每年週日4點我22分,開始執行 /etc/cron.weekly目錄下的可執行程式或指令碼;

re:似乎有個錯誤?

22 4 * * 7 中7的意思是每週的週日執行,不是每年的第七週吧?

ps:這裡7和0的意思是相同的吧!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-925921/,如需轉載,請註明出處,否則將追究法律責任。

相關文章