1. 程式人生 > >linux下用cron定時執行任務的方法

linux下用cron定時執行任務的方法

名稱 : crontab

使用許可權 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的檔案替代目前的crontab。

crontab-[-u user]-用標準輸入替代目前的crontab.

crontab-1[user]-列出使用者目前的crontab.

crontab-e[user]-編輯使用者目前的crontab.

crontab-d[user]-刪除使用者目前的crontab.

crontab-c dir- 指定crontab的目錄。

crontab檔案的格式:M H D m d cmd.

基本格式 :

* * * * * command

分 時 日 月 周 命令

M: 分鐘(0-59)。每分鐘用*或者 */1表示

H:小時(0-23)。(0表示0點)

D:天(1-31)。

m: 月(1-12)。

d: 一星期內的天(0~6,0為星期天)。

cmd要執行的程式,程式被送入sh執行,這個shell只有USER,HOME,SHELL這三個環境變數

說明 :

crontab 是用來讓使用者在固定時間或固定間隔執行程式之用,換句話說,也就是類似使用者的時程表。-u user 是指設定指定 user 的時程表,這個前提是你必須要有其許可權(比如說是 root)才能夠指定他人的時程表。如果不使用 -u user 的話,就是表示設定自己的時程表。

引數 :

crontab -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,如果你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(比如說 setenv VISUAL joe)

crontab -r : 刪除目前的時程表

crontab -l : 列出目前的時程表

crontab file [-u user]-用指定的檔案替代目前的crontab。

時程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程式。

當 f1 為 * 時表示每分鐘都要執行 program,f2 為 * 時表示每小時都要執行程式,其餘類推

當 f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推

當 f1 為 */n 時表示每 n 分鐘個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其餘類推

當 f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推

使用者也可以將所有的設定先存放在檔案 file 中,用 crontab file 的方式來設定時程表。

例子 :

#每天早上7點執行一次 /bin/ls :

0 7 * * * /bin/ls

在 12 月內, 每天的早上 6 點到 12 點中,每隔3個小時執行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

週一到週五每天下午 5:00 寄一封信給
[email protected]
:

0 17 * * 1-5 mail -s "hi" [email protected] < /tmp/maildata

每月每天的午夜 0 點 20 分, 2 點 20 分, 4 點 20 分....執行 echo "haha"

20 0-23/2 * * * echo "haha"

注意 :

當程式在你所指定的時間執行後,系統會寄一封信給你,顯示該程式執行的內容,若是你不希望收到這樣的信,請在每一行空一格之後加上 > /dev/null 2>&1 即可

例子2 :

#每天早上6點10分

10 6 * * * date

#每兩個小時

0 */2 * * * date

#晚上11點到早上8點之間每兩個小時,早上8點

0 23-7/2,8 * * * date

#每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點

0 11 4 * mon-wed date

#1月份日早上4點

0 4 1 jan * date

範例

$crontab -l 列出使用者目前的crontab.

/usr/lib/cron/cron.allow表示誰能使用crontab命令。如果它是一個空檔案表明沒有一個使用者能安排作業。如果這個檔案不存在,而有另外一個檔案/usr/lib/cron/cron.deny,則只有不包括在這個檔案中的使用者才可以使用crontab命令。如果它是一個空檔案表明任何使用者都可安排作業。兩個檔案同時存在時cron.allow優先,如果都不存在,只有超級使用者可以安排作業。

crontab檔案的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重啟apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重啟apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每週六、週日的1 : 10重啟apache。

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重啟apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart

每一小時重啟apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

晚上11點到早上7點之間,每隔一小時重啟apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4號與每週一到週三的11點重啟apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一號的4點重啟apache

例子:

每兩個時間值中間使用逗號分隔。

除了數字還有幾個個特殊的符號就是”*”、”/”和”-”、”,”,*代表所有的取值範圍內的數字,”/”代表每的意思,”*/5″表示每5個單位,”-”代表從某個數字到某個數字,”,”分開幾個離散的數字。

每天早上6點

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從螢幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。

每兩個小時

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11點到早上8點之間每兩個小時,早上八點

0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt

每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點

0 11 4 * 1-3 command line

1月1日早上4點

0 4 1 1 * command line

每次編輯完某個使用者的cron設定後,cron自動在/var/spool/cron下生成一個與此使用者同名的檔案,此使用者的cron資訊都記錄在這個檔案中,這個檔案是不可以直接編輯的,只可以用crontab -e 來編輯。cron啟動後每過一份鍾讀一次這個檔案,檢查是否要執行裡面的命令。因此此檔案修改後不需要重新啟動cron服務。

2.編輯/etc/crontab 檔案配置cron

cron 服務每分鐘不僅要讀一次/var/spool/cron內的所有檔案,還需要讀一次/etc/crontab,因此我們配置這個檔案也能運用cron服務做一些事情。用crontab配置是針對某個使用者的,而編輯/etc/crontab是針對系統的任務。此檔案的檔案格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出現錯誤,或者有資料輸出,資料作為郵件發給這個帳號

HOME=/ //使用者執行的路徑,這裡是根目錄

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的指令碼

02 4 * * * root run-parts /etc/cron.daily //每天執行/etc/cron.daily內的指令碼

22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的指令碼

42 4 1 * * root run-parts /etc/cron.monthly //每月去執行/etc/cron.monthly內的指令碼

二、cron 定時

cron是一個linux下的定時執行工具,可以在無需人工干預的情況下執行作業。由於Cron 是Linux的內建服務,但它不自動起來,可以用以下的方法啟動、關閉這個服務:

/sbin/service crond start //啟動服務

/sbin/service crond stop //關閉服務

/sbin/service crond restart //重啟服務

/sbin/service crond reload //重新載入配置

你也可以將這個服務在系統啟動的時候自動啟動:

在/etc/rc.d/rc.local這個指令碼的末尾加上:

/sbin/service crond start

現在Cron這個服務已經在程序裡面了,我們就可以用這個服務了,Cron服務提供以下幾種介面供大家使用:

1、直接用crontab命令編輯

cron服務提供crontab命令來設定cron服務的,以下是這個命令的一些引數與說明:

crontab -u //設定某個使用者的cron服務,一般root使用者在執行這個命令的時候需要此引數

crontab -l //列出某個使用者cron服務的詳細內容

crontab -r //刪除某個使用者的cron服務

crontab -e //編輯某個使用者的cron服務

比如說root檢視自己的cron設定:crontab -u root -l

再例如,root想刪除fred的cron設定:crontab -u fred -r

在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e

進入vi編輯模式,編輯的內容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

這個格式的前一部分是對時間的設定,後面一部分是要執行的命令,如果要執行的命令太多,可以把這些命令寫到一個腳本里面,然後在這裡直接呼叫這個指令碼就可以了,呼叫的時候記得寫出命令的完整路徑。時間的設定我們有一定的約定,前面五個*號代表五個數字,數字的取值範圍和含義如下:

分鐘 (0-59)

小時 (0-23)

日期 (1-31)

月份 (1-12)

星期 (0-6)//0代表星期天

除了數字還有幾個個特殊的符號就是"*"、"/"和"-"、",",*代表所有的取值範圍內的數字,"/"代表每的意思,"*/5"表示每5個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字



cron用法很簡單:先來一個速成的:
第一步:寫cron指令碼檔案。例如:取名一個 crontest.cron的文字檔案,只需要寫一行:
             15,30,45,59 * * * * echo "xgmtest.........." >> xgmtest.txt
             表示,每隔15分鐘,執行列印一次命令
第二步:新增定時任務。執行命令 “crontab crontest.cron”。搞定
第三步:如不放心,可以輸入 "crontab -l" 檢視是否有定時任務
詳細資訊:

crontab用法 
  crontab命令用於安裝、刪除或者列出用於驅動cron後臺程序的表格。也就是說,使用者把需要執行的命令序列放到crontab檔案中以獲得執行。每個使用者都可以有自己的crontab檔案。下面就來看看如何建立一個crontab檔案。 

  在/var/spool/cron下的crontab檔案不可以直接建立或者直接修改。crontab檔案是通過crontab命令得到的。現在假設有個使用者名稱為foxy,需要建立自己的一個crontab檔案。首先可以使用任何文字編輯器建立一個新檔案,然後向其中寫入需要執行的命令和要定期執行的時間。 

  然後存檔退出。假設該檔案為/tmp/test.cron。再後就是使用crontab命令來安裝這個檔案,使之成為該使用者的crontab檔案。鍵入: 

  crontab test.cron 

  這樣一個crontab 檔案就建立好了。可以轉到/var/spool/cron目錄下面檢視,發現多了一個foxy檔案。這個檔案就是所需的crontab 檔案。用more命令檢視該檔案的內容可以發現檔案頭有三行資訊: 

  #DO NOT EDIT THIS FILE -edit the master and reinstall. 

  #(test.cron installed on Mon Feb 22 14:20:20 1999) 

  #(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $) 

  大概意思是: 

  #切勿編輯此檔案——如果需要改變請編輯原始檔然後重新安裝。 

  #test.cron檔案安裝時間:14:20:20 02/22/1999 

  如果需要改變其中的命令內容時,還是需要重新編輯原來的檔案,然後再使用crontab命令安裝。 

  可以使用crontab命令的使用者是有限制的。如果/etc/cron.allow檔案存在,那麼只有其中列出的使用者才能使用該命令;如果該檔案不存在但cron.deny檔案存在,那麼只有未列在該檔案中的使用者才能使用crontab命令;如果兩個檔案都不存在,那就取決於一些引數的設定,可能是隻允許超級使用者使用該命令,也可能是所有使用者都可以使用該命令。 

  crontab命令的語法格式如下: 

  crontab [-u user] file 

  crontab [-u user]{-l -r -e} 

  第一種格式用於安裝一個新的crontab 檔案,安裝 淳褪莊ile所指的檔案,如果使用“-”符號作為檔名,那就意味著使用標準輸入作為安裝來源。 

  -u 如果使用該選項,也就是指定了是哪個具體使用者的crontab 檔案將被修改。如果不指定該選項,crontab 將預設是操作者本人的crontab ,也就是執行該crontab 命令的使用者的crontab 檔案將被修改。但是請注意,如果使用了su命令再使用crontab 命令很可能就會出現混亂的情況。所以如果是使用了su命令,最好使用-u選項來指定究竟是哪個使用者的crontab檔案。 

  -l 在標準輸出上顯示當前的crontab。 

  -r 刪除當前的crontab檔案。 

  -e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab檔案。當結束編輯離開時,編輯後的檔案將自動安裝。 

  [例7] 

  # crontab -l #列出使用者目前的crontab。 

  10 6 * * * date 

  0 /2 * * date 

  0 23-7/2,8 * * * date 

  # 

  在crontab檔案中如何輸入需要執行的命令和時間。該檔案中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者製表符分隔。格式如下: 

  minute hour day-of-month month-of-year day-of-week commands 

  第一項是分鐘,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一週的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果使用者不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字元,所以就可以認為是任何時間,也就是該項被忽略了。在表4- 1中給出了每項的合法範圍。 

 表4-1 指定時間的合法範圍 

時間 minute hour day-of-month month-of-year day-of-week  
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday)  

  這樣使用者就可以往crontab 檔案中寫入無限多的行以完成無限多的命令。命令域中可以寫入所有可以在命令列寫入的命令和符號,其他所有時間域都支援列舉,也就是域中可以寫入很多的時間值,只要滿足這些時間值中的任何一個都執行命令,每兩個時間值中間使用逗號分隔。 

 除了數字還有幾個個特殊的符號就是"*"、"/"和"-"、",",*代表所有的取值範圍內的數字,"/"代表每的意思,"/5"表示每5個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字。 

幾個例子: 

每天早上6點 
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從螢幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。每兩個小時 
0 */2 * * * echo "Have a break now." >> /tmp/test.txt晚上11點到早上8點之間每兩個小時,早上八點 
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 
0 11 4 * 1-3 command line1月1日早上4點 
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有資料輸出,資料作為郵件發給這個帳號 HOME=/        //使用者執行的路徑,這裡是根目錄 # run-parts 01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的指令碼 02 4 * * * root run-parts /etc/cron.daily //每天執行/etc/cron.daily內的指令碼 22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的指令碼 42 4 1 * * root run-parts /etc/cron.monthly //每月去執行/etc/cron.monthly內的指令碼 大家注意"run-parts"這個引數了,如果去掉這個引數的話,後面就可以寫要執行的某個指令碼名,而不是資料夾名了。   
這就是表示任意天任意月,其實就是每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。 
5,15,25,35,45,55 16,17,18 * * * command在每週一,三,五的下午3:00系統進入維護狀態,重新啟動系統。那麼在crontab 檔案中就應該寫入如下欄位: 
  00 15 * * 1,3,5 shutdown -r +5然後將該檔案存檔為foxy.cron,再鍵入crontab foxy.cron安裝該檔案。 
每小時的10分,40分執行使用者目錄下的innd/bbslin這個指令: 
  10,40 * * * * innd/bbslink每小時的1分執行使用者目錄下的bin/account這個指令: 
 1 * * * * bin/account每天早晨三點二十分執行使用者目錄下如下所示的兩個指令(每個指令以;分隔): 
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)   
每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果新增在mm.txt這個檔案之後(mm.txt檔案位於使用者自己的目錄位置)。 
  12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt

crontab的正確用法(簡短節省大家時間)命令: 1 man cron 2 man crontab 3 man 5 crontab ==> 中間有個5。命令"crontab -e": -------------------------------------------------------------------------------- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin #這是盲點,沒想過要設,一次次的失望。[冒號分隔] DISPLAY=:0.0 #加上吧,有冒號有句點。 # 分 鍾 日 月 周 命令 1 23 1 8 * shutdown -h +3 #1月8日23點1分關機(延時3分鐘) 1,4,7 23 1 8 * # 1分,4分,7分[1月8日23點] */3 23 1 8 * # 0,3,6,9...每隔3分鐘(或每過3分鐘,與每3分鐘有點不同) [1-10]/3 23 1 8 * # 1分,4分,7分[從1分起,逐次加3分鐘,直到大於10==>這是 正確解法] @reboot shutdown -k now #這行能把你嚇壞,一開機就關機(要是把"-k"換成"-h"的話)。 "@reboot"表示啟動時執行。 ---------------------------------END-------------------------------------------- 另一個指令碼: ******************************************************************************* [0-59]/5 23 * * * shutdown -h now #每天晚上11點每隔5分鐘關一次機,願望很好,但是將不會執行,因為沒設PATH變數,解決方法見下行。 [0-59]/5 23 * * * /sbin/shutdown -h now #保證關得很死,給出了路徑。 0 6 1 8 * xmms /music/zhangchu/輕取.mp3 #明天早上6點鐘放首歌叫我。但睡到7點鐘還是沒聽到音樂,傷心失望。[DISPLAY=:0.0]。對本行的最後一點補充:現今99%主機板都支援定時開機,沒有鬧鐘的話可以叫電腦叫醒你,選項在BIOS電源裡面[wake up by alarm]。 *********************************END******************************************* 可以自由修改,最初發佈於Linuxsir網站。 
我們來看一個超級使用者的crontab檔案:
   #Run the ‘atrun' program every minutes   #This runs anything that's due to run from ‘at'.See man ‘at' or ‘atrun'.   0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun   40 7 * * * updatedb   8,10,22,30,39,46,54,58 * * * * /bin/sync