cron表達式詳解

Crontab

Crontab簡介

crontab命令常見於Unix和類Unix的操做系統之中,用於設置週期性被執行的指令。該命令從標準輸入設備讀取指令,並將其存放於「crontab」文件中,以供以後讀取和執行。該詞來源於希臘語 chronos(χρνο),原意是時間。一般,crontab儲存的指令被守護進程激活, crond經常在後臺運行,每一分鐘檢查是否有預約的做業須要執行。這類做業通常稱爲cron jobs。linux

系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。shell

/etc/crontab 文件以下apache

[root@localhost ~]# 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@localhost ~]#

前四行是用來配置crond任務運行的環境變量,第一行SHELL變量指定了系統要使用哪一個shell,這裏是bash,第二行PATH變量指定了系統執行命令的路徑,第三行MAILTO變量指定了crond的任務執行信息將經過電子郵件發送給root用戶,若是MAILTO變量的值爲空,則表示不發送任務執行信息給用戶,第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。第六至九行表示的含義將在下個小節詳細講述。這裏不在多說。緩存

用戶任務調度:用戶按期要執行的工做,好比用戶數據備份、定時郵件提醒等。用戶可使用 crontab 工具來定製本身的計劃任務。全部用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。bash

crontab 文件的含義

用戶所創建的crontab文件中,每一行都表明一項任務,每行的每一個字段表明一項設置,它的格式共分爲六個字段,前五段是時間設定段,第六段是要執行的命令段,格式以下:工具

minute hour day month week commandurl

其中:操作系統

  • minute: 表示分鐘,能夠是從0到59之間的任何整數。
  • hour:表示小時,能夠是從0到23之間的任何整數。
  • day:表示日期,能夠是從1到31之間的任何整數。
  • month:表示月份,能夠是從1到12之間的任何整數。
  • week:表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。
  • command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

在以上各個字段中,還可使用如下特殊字符:rest

  • 星號 (*) :

    表明全部可能的值,例如month字段若是是星號,則表示在知足其它字段的制約條件後每個月都執行該命令操做。日誌

  • 逗號(,):

    能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」

  • 中槓(-):

    能夠用整數之間的中槓表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」

  • 正斜線(/):

    能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次。

linux 下 crond 服務

# 安裝crontab:
$ yum install crontabs

# 啓動服務
$ systemctl start crond.service

# 關閉服務
$ systemctl stop crond.service

# 重啓服務
$ systemctl restart crond.service

# 從新載入配置
$ systemctl reload crond.service

# 查看crontab服務狀態:
$ systemctl status crond.service

# 加入開機自動啓動:
$ systemctl enable crond.service

crontab命令詳解

命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]
命令功能:

經過crontab 命令,咱們能夠在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位能夠是分鐘、小時、日、月、周及以上的任意組合。這個命令很是設合週期性的日誌分析或數據備份等工做。

命令參數:

-u [UserName]:用來設定某個用戶的crontab服務,例如,「-u ixdba」表示設定ixdba用戶的crontab服務,此參數通常有root用戶來運行。

-e:編輯某個用戶的crontab文件內容。若是不指定用戶,則表示編輯當前用戶的crontab文件。

-l:顯示某個用戶的crontab文件內容,若是不指定用戶,則表示顯示當前用戶的crontab文件內容。

-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,若是不指定用戶,則默認刪除當前用戶的crontab文件。

-i:在刪除用戶的crontab文件時給確認提示。

-v:列出用戶cron做業的狀態

實際案例

# 每1分鐘執行一次command
* * * * * command

每小時的第3和第15分鐘執行
3,15 * * * * command

# 在上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * * command

# 每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * command

# 每一個星期一的上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 command

# 每晚的21:30重啓smb 
30 21 * * * /etc/init.d/smb restart

# 每個月一、十、22日的4 : 45重啓smb 
45 4 1,10,22 * * /etc/init.d/smb restart

# 每週6、週日的1 : 10重啓smb
10 1 * * 6,0 /etc/init.d/smb restart

# 天天18 : 00至23 : 00之間每隔30分鐘重啓smb 
0,30 18-23 * * * /etc/init.d/smb restart

# 每星期六的晚上11 : 00 pm重啓smb 
0 23 * * 6 /etc/init.d/smb restart

# 每一小時重啓smb 
\* */1 * * * /etc/init.d/smb restart

# 晚上11點到早上7點之間,每隔一小時重啓smb 
\* 23-7/1 * * * /etc/init.d/smb restart

# 每個月的4號與每週一到週三的11點重啓smb 
0 11 4 * mon-wed /etc/init.d/smb restart

# 一月一號的4點重啓smb 
0 4 1 jan * /etc/init.d/smb restart

# 每小時執行/etc/cron.hourly目錄內的腳本
01   *   *   *   *     root run-parts /etc/cron.hourly

run-parts這個參數了,若是去掉這個參數的話,後面就能夠寫要運行的某個腳本名,而不是目錄名了

使用注意事項

注意清理系統用戶的郵件日誌

每條任務調度執行完畢,系統都會將任務輸出信息經過電子郵件的形式發送給當前系統用戶,這樣日積月累,日誌信息會很是大,可能會影響系統的正常運行,所以,將每條任務進行重定向處理很是重要。

例如,能夠在crontab文件中設置以下形式,忽略日誌輸出:

0 */3 * * * /usr/local/apache2/apachectl restart > /dev/null 2>&1

/dev/null 2>&1表示先將標準輸出重定向到/dev/null,而後將標準錯誤重定向到標準輸出,因爲標準輸出已經重定向到了/dev/null,所以標準錯誤也會重定向到/dev/null,這樣日誌輸出問題就解決了。

其餘注意事項

新建立的cron job,不會立刻執行,至少要過2分鐘才執行。若是重啓cron則立刻執行。

當crontab忽然失效時,能夠嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的全部crontab都沒了。

在crontab中%是有特殊含義的,表示換行的意思。若是要用的話必須進行轉義%,如常常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+%Y%m%d

相關文章
相關標籤/搜索