1. 程式人生 > >【Linux】定時任務crontab

【Linux】定時任務crontab

在Linux或類Unix系統中,通常使用 crontab 命令在指定的時間執行一個shell指令碼或者一系列Linux命令,也就是通常所說的定時任務。

一、cron 程序

在詳細介紹crontab之前,必須要說一下 cron 程序

1、cron程序是linux中的守護程序,在系統後臺執行,它會(預設每分鐘)持續地檢查/etc/crontab檔案、/etc/cron.*/目錄、/var/spool/cron/ 目錄,讀取排程任務並執行。

2、所有使用者建立的crontab檔案都儲存在/var/spool/cron/ 目錄,被cron服務定時檢查。


二、crontab命令:

crontab

命令可以用來建立、編輯、查詢、刪除定時任務。

通過 crontab 命令,每個使用者都可以編輯或者配置自己的定時任務,並擁有自己的 crontab 檔案。

1、建立/編輯 crontab 檔案

在 linux 命令列中輸入crontab -e, 即可建立或編輯使用者自己的crontab檔案:

crontab -e

當crontab檔案不存在時,即為建立;已存在時即為編輯;

此時,可以輸入具體的crontab命令,用來增加、修改或刪除當前使用者的某一項任務。

在crontab檔案中,每一行命令代表一個定時任務!

2、crontab 語法(欄位介紹)

crontab -e之後,即可輸入crontab命令,具體語法如下:

    1 2 3 4 5 /path/to/command arg1 arg2
    或者:
    1 2 3 4 5 /root/ntp_sync.sh

各欄位的格式:

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
分鐘 (0-59) 小時 (0-23) 日期 (1-31) 月份 (1-12) 一週當中的某天 (0-7 [7 或 0 代表星期天]) 計劃執行的指令碼或命令的完整路徑

3、crontab 命令示例

(結合第4部分的操作符使用方法一起學習)

    # 每隔 5 分鐘執行一次 backupscript 指令碼 ##
    */5 * * * * /root/backupscript.sh
    
    ### 每天的凌晨 1 點執行 backupscript 指令碼 ##
    0 1 * * * /root/backupscript.sh
    
    ### 每月的第一個凌晨 3:15 執行 backupscript 指令碼 ##
    15 3 1 * * /root/backupscript.sh
    
    ### 每個工作日(Mon – Fri) 11:59 p.m 都進行備份作業。
    59 23 * * 1,2,3,4,5 /root/bin/backup.sh
    或者:
    59 23 * * 1-5 /root/bin/backup.sh
    
    ### 每週六、週日的3點10分執行hello.sh
    10 3 * * 0,6 hello.sh
    
    ### 晚上11點到早上8點之間每兩個小時,及每天早上八點,輸出資訊到檔案中
    0 23-7/2,8 * * * echo "have a good dream:)" >> /tmp/test.txt

    ### 每個月的4號與每個禮拜的禮拜一到禮拜三的早上11點執行命令
    0 11 4 * 1-3 command
可以把經常要做的一些事放到其中,簡化工作量,如每週一檢查伺服器的執行狀態,檢視報告,殺掉一些程序等等……

4、crontab 命令輔操作符

操作符允許為一個欄位指定多個值,這裡有三個操作符可供使用:

  • 星號 (*) : 代表任何時刻

    • 舉個例子,在小時欄位中,一個星號等同於每個小時;在月份欄位中,一個星號則等同於每月。
  • 逗號 (,) : 在一個欄位上指定多個值,例如:1,5,10,15,20,25

  • 橫槓 (-) : 指定了一個值的範圍

    • 例如:5-15 ,等同於使用逗號操作符鍵入的 5,6,7,8,9,…,13,14,15。
  • 分隔符 (/) : 代表‘每’,/n表示每隔n單位間隔

    • 例如:小時欄位為*/5 表示每5小時,也可以寫成0-23/5,意思一樣。其它欄位也是類似的。

5、crontab 檢視和刪除某使用者所有的定時任務

    crontab -l  # 預設檢視當前使用者的所有定時任務

    # 使用-u 引數檢視指定使用者的定時任務,需要以root使用者身份執行
    crontab -u username -l  

    crontab -r  # 刪除當前使用者的crontab的所有任務內容,慎用!
    
    ### 刪除指定使用者名稱下的定時任務,需要以 root 使用者身份執行,慎用!
    crontab -r -u username

6、禁用郵件輸出

預設情況下,某個命令或者指令碼的輸出內容(如果有的話)會發送到你的本地郵箱賬戶中。若想停止接收 crontab 傳送的郵件,需要新增 >/dev/null 2>&1 這段內容到執行的命令的後面,例如:

0 3 * * * /root/backup.sh >/dev/null 2>&1

7、使用特殊字串

linux中提供了以下 8 個特殊字串,可以用來替代crontab命令的前五個欄位,這樣不但可以節省時間,還可以提高可讀性。

特殊字元 含義
@reboot 在每次啟動時執行一次
@yearly 每年執行一次, 等同於 “0 0 1 1 *”
@annually (同 @yearly)
@monthly 每月執行一次, 等同於 “0 0 1 * *”
@weekly 每週執行一次, 等同於 “0 0 * * 0”
@daily 每天執行一次, 等同於 “0 0 * * *”
@midnight (同 @daily)
@hourly 每小時執行一次, 等同於 “0 * * * *”

示例:

## 每小時執行一次 ntpdate 命令
@hourly /path/to/ntpdate