Linux定時執行任務Crontab

問題由來

今天在看一個關於服務器性能測試的視頻,視頻中說到了一個Linux下的crontab命令,好陌生的一個命令啊,然後查閱資料,寫了個小Demo把這個crontab相關的知識總結了一遍,對於我來說,這又是一個新的知識點,每天都在進步。

注:以下總結基於Ubuntu 12.04

去/etc目錄下看看

先去Ubuntu的/etc目錄下看看,我們都知道/etc目錄主要用來存放系統中的配置文件,基本上所有的配置文件都可以在這裏找到。運行以下命令看看:

ls /etc/cron*

這個命令會列出/etc目錄下所有以cron開頭的文件和文件夾。可以看到主要有以下文件夾:

/etc/cron.hourly 這裏存放了每小時需要運行的腳本
/etc/cron.daily 這裏存放了每天需要運行的腳本
/etc/cron.weekly 這裏存放了每個星期需要運行的腳本
/etc/cron.monthly 這裏存放了每月需要運行的腳本
/etc/cron.d 如果既不是按小時,也不按天,周和月來運行,就放在這個文件夾

原來,我們可以把我們需要定時運行的腳本放到對應的文件夾中,系統就會定時運行對應的腳本了。那麼系統是怎麼做到的呢?

/etc目錄下,還有一個crontab文件,該文件內容如下:

# /etc/crontab: system-wide crontab# Unlike any other crontab you don't have to run the `crontab'# command to install the new version when you edit this file# and files in /etc/cron.d. These files also have username fields,# that none of the other crontabs do.
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user  command17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )#

如果你英語不錯的話,閱讀上面的英文註釋就可以看懂了。crontab文件是一個系統級別的配置文件,裏面配置了什麼時候去運行什麼文件的規則。Linux會定期去掃描對應的文件夾,運行裏面的腳本。這就完成了定時執行任務的功能。

cron服務

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

service cron start //啓動服務
service cron stop //關閉服務
service cron restart //重啓服務
service cron reload //重新載入配置

cron命令每分鐘會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而Linux任務調度的工作主要分爲以下兩類:

  • 系統執行的工作:系統週期性所要執行的工作,如備份系統數據、清理緩存;

  • 個人執行的工作:某個用戶定期要做的工作,例如每天備份數據庫等。

/var/spool/cron/目錄下是所有用戶的crontab文件,你也可以去看看。上面說到的/etc下的配置都是屬於系統級別的,那麼個人級別的定時執行如何來做呢?這就需要說到下面的crontab命令了。

crontab命令

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

crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除沒個用戶的cron服務
crontab -e //編輯某個用戶的cron服務

如果不指定用戶,就是當前系統的登陸用戶。

當你輸入命令:crontab -e時,就會出現一個文件,讓你填寫對應的定時規則,這個規則是什麼?

定時規則

看這條規則:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

這就是一條規則,表示每天的6點25分執行對應的腳本。沒有看明白,不要緊,容我慢慢道來。

以下是 crontab 文件的格式:

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
  • minute:區間爲0–59;

  • hour:區間爲0–23;

  • day-of-month:區間爲0–31;

  • month:區間爲1–12;1是1月,12是12月;

  • Day-of-week:區間爲0–6;週日是0。

除了數字還有以下幾個特殊的符號需要特殊說明:
*:代表所有的取值範圍內的數字;
/:代表每的意思,"*/5"表示每5個單位;
-:代表從某個數字到某個數字;
,:分開幾個離散的數字。

以下舉幾個例子說明問題:

每五分鐘執行    */5 * * * * /home/jelly/test.sh
每小時執行      0 * * * * /home/jelly/test.sh
每天執行        0 0 * * * /home/jelly/test.sh
每週執行        0 0 * * 0 /home/jelly/test.sh
每月執行        0 0 1 * * /home/jelly/test.sh
每年執行        0 0 1 1 * /home/jelly/test.sh
每天早上6     0 6 * * * /home/jelly/test.sh
每兩個小時      0 */2 * * * /home/jelly/test.sh
晚上11點到早上8點之間每兩個小時0 23-7/2 * * * /home/jelly/test.sh
11日早上40 4 1 1 * /home/jelly/test.sh

我想這下你應該明白了,如果還沒有明白,沒問題,再來個實例,你就能明白了。

一個小Demo

先準備以下這麼一段簡短的腳本:

#!/bin/bashvar="http://www.jellythink.com"echo $varexit 0

保存爲文件backupDemo.sh。
bash腳本不懂,沒關係,看這裏:

  • 《Linux Shell簡明教程(一)》

  • 《Linux Shell簡明教程(二)》

在終端輸入以下命令:

crontab -e

在顯示的文件末尾添加以下規則:

*/1 * * * * /home/jelly/MySource/Shell/backupDemo.sh >> /home/jelly/log.log

編輯完成,保存完成以後,就會顯示以下提示信息:

crontab: installing new crontab

這就說明正在安裝新的定時任務,如果沒有這條提示信息,請重新運行crontab -e命令。

接下來就會看到在/home/jelly目錄下會生成一個log.log文件,並寫入了輸入的信息。

沒有問題,搞定了。

總結

本來是中午看的一個視頻,沒有想到一個小的知識點寫出了這麼長的一篇文章。好了,還是我不會的東西太多了,繼續學習吧。

Stay hungry. Stay foolish!!!

果凍想-一個原創技術文章分享網站。

2015年2月3日 於深圳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章