1. 程式人生 > >Centos下執行定時任務Crontab命令介紹

Centos下執行定時任務Crontab命令介紹

1.Cron的啟動與關閉

由於Cron是Linux的內建服務,可以用以下的方法啟動.關閉這個服務:

/sbin/service crond start           //啟動服務
/sbin/service crond stop            //關閉服務
/sbin/service crond restart        //重啟服務
/sbin/service crond reload         //重新載入配置

2.Cron配置檔案

2.1全域性配置檔案

crontab在/etc目錄下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五個目錄和crontab,cron.deny二個檔案.

cron.daily是每天執行一次的job,cron.weekly是每個星期執行一次的job.cron.monthly是每月執行一次的job,cron.hourly是每個小時執行一次的job.cron.d是系統自動定期需要做的任務,但是又不是按小時,按天,按星期,按月來執行的,那麼就放在這個目錄下面.

/etc/crontab檔案一般如下:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

我們可在此檔案中新增自己需要的cron job.

/etc/cron.deny檔案就是用於控制不讓哪些使用者使用Crontab的功能.

2.2使用者配置檔案

每個使用者都有自己的cron配置檔案,通過crontab -e 就可以編輯,一般情況下我們編輯好使用者的cron配置檔案儲存退出後,系統會自動就存放於/var/spool/cron/目錄中,檔案以使用者名稱命名.

linux的cron服務是每隔一分鐘去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的內容.

3.Cron命令格式

crontab [ -u user ] 檔案 
crontab [ -u user ] { -l | -r | -e }

-u:指定某一使用者

-e:執行文字編輯器來設定使用者(當前使用者或指定使用者)時程表,內定的文字編輯器是vi.
-r:刪除使用者時程表.
-l:列出使用者時程表.

4.Cron檔案格式

*  *  *  *  *  command
分 時 日 月 周   命令

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

5.Cron檔案使用說明

5.1 一般情況

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

* * * * * /bin/usershell  每天每分鐘執行一次/bin/usershell
當f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推.

0-12 * * * * /bin/usershell  每天每小時從0到12分鐘每分鐘執行一次/bin/usershell
當f1 為 */n 時表示每 n 分鐘個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其餘類推.

* */2 * * * /bin/usershell  每天每2小時執行一次/bin/usershell
當f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推.

* 1,3,5,7 * * * /bin/usershell  每天每逢1,3,4,7點執行一次/bin/usershell

5.2. 衝突邏輯

日期可以用月限定,也可以用“星期”指定,如果兩個段有衝突,那麼,第六段的命令將在匹配任何一個的情況下都執行,比如

"30 4 1,15 * 5",將在每月的1號和15號加每個週五,上午4:30執行.

5.3. 符號"%"

"%"在Cron檔案中,有"結束命令列","換行","重定向"的作用,假如不需要"%"的特殊作用,需要使用轉義符轉義.

5.4. @reboot

這個不需要理解,為了達到在開機後執行,且只執行一次的目的.除了這個,也無法通過前五段的設定來實現.

@annually也是這個功能.

至於@yearly,@monthly等等其實都可以用上面的五段來設定.

然後我自己寫了一個小例子做了下測試:

使用crontab -e進行編輯,內容為:

*/2 * * * * echo "i am crontab" >> /home/zhang/hello

這樣隔兩分鐘就會往hello這個檔案裡寫i am crontab

我自己寫了一個指令碼task.sh,直接執行task.sh時可以執行,可是加到crontab裡就有運行了,後來我查看了網上的解決方法,終於解決了,先來看一下我原來寫的task.sh指令碼吧:

#!/bin/sh

java -jar offergateway.biz.offer-1.0-SNAPSHOT.jar

crontab定時任務的寫法為:

* * * * *  /task.sh

後來我查了網上說要執行crontab,必須使用絕對路徑,然後我把路徑都改成絕對路徑了。

在crontab的執行環境變數中,沒有相應使用者設定的環境變數,你需要手動設定一下環境變數,才能讓它生效。於是我把上面的指令碼改成:

#!/bin/sh

. /etc/profile

java -jar /home/zhang/offergateway.biz.offer-1.0-SNAPSHOT.jar

crontab也改成絕對路徑:

* * * * *  sh /home/zhang/task.sh

哈哈,成功了~~happy~~