2011年9月19日 星期一

[Linux] crontab

* Definition
  • Linux/Unix 系統中用來讓系統各使用者自行設定在需要的時間 ,做需要的事的程式。
  • crontab 這個指令所設定的工作將會循環的一直進行下去! 除了可以使用指令執行外,亦可編輯 /etc/crontab 來支援。
  • 讓 crontab 可以生效的服務則是 crond 這個服務。
  • 若只需處理僅執行一次就結束排程的指令,可用 at

* 一般 Linux 在開機時會自動載入,如果發現無 crond 在跑,可以到 /etc/rc.d/ 目錄下看看是否有將執行crond 程式的指令加入開機自動執行檔裡面。


* User Name -> crontab file name
  • 當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裡面去了,而且是以帳號來作為判別的。
  • 所有使用者的 crontab 檔都會存檔 /usr/spool/cron/crontab/ 下,每個人都只有一個檔案存在,檔名就是該帳號的名字。ex:
    • dmtsai 使用 crontab 後, 他的工作會被紀錄到 /var/spool/cron/dmtsai

[Note] 不要使用 vi 直接編輯該檔案, 因為可能由於輸入語法錯誤,會導致無法執行 cron 。

* cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中。

* Re-start /etc/init.d/crond restar
在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啟動 crond 這個服務吧!『/etc/init.d/crond restart』。


* syntax:
#crontab [-u username] [-l|-e|-r]

/*
選項與參數:
-u : 只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab 工作排程;
-e : 編輯 crontab 的工作內容
-l  : 查閱 crontab 的工作內容
-r : 移除所有的 crontab 的工作內容,若僅要移除一項,請用 -e 去編輯。
*/


[Note]
  • 如果只是要刪除某個 crontab 的工作項目,那麼請使用 crontab -e 來重新編輯即可!』如果使用 -r 的參數,是會將所有的 crontab 資料內容都刪掉的。
  • 使用者可以用 crontab -e 指令來編寫需要做的工作或者將要執行的工作,或寫在一個 file 裡,再執行 crontab filename 就可以了。
  • 注意必須使用 絕對路徑。

ex:
// 此時會進入 vi 的編輯畫面讓您編輯工作,然後以一個工作一行來編輯,
// 編輯完畢之後輸入『 :wq 』儲存後離開 vi 就可以了。
#crontab -e


* 每項工作 (每行) 的格式都是具有六個欄位,如下:
(minute) (hour) (day of month) (month) (day of week) (job)

* 每欄位可填入的值如下:

  • minute: 0-59
  • hour: 0-23
  • day of month: 1-31
  • month: 1-12 (or names, see below)
  • day of week: 0-7 (0 or 7 is Sun, or use names),週的數字為 0 或 7 時,都代表『星期天』的意思。


ex:
# 每小時的 5,15,25,35,45,55 分
5,15,25,35,45,55 * * * * (job)

# 每個小時 10 分
1 * * * *  (job)

 # 每天早上三點整
0 3 * * * (job)

# 每個月一號早上 3:50
50 3 1 * * (job)

# 每週日早上 4:30
30 4 * * 0 (job)

# 每週六早上 5:30
30 5 * * 6 (job)



* 特殊符號
  • 星號(*)
    • 代表任何時刻都接受。
    • ex: 0 12 * * * (job)
      • 日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思。
  • 逗號(,)
    • 代表分隔時段的意思。
    • ex: 0 3,6 * * * command
      • 要下達的工作是 3:00 與 6:00,第二欄是 3,6 ,代表 3 與 6 都適用 。
  • 減號(-)
    • 代表一段時間範圍內。
    • ex: 20 8-12 * * * command
      • 8 點到 12 點之間的每小時的 20 分都進行一項工作,第二欄變成 8-12 ,代表 8,9,10,11,12 都適用的意思。
  • 斜線(/n)
    • n 代表數字,亦即是『每隔 n 單位間隔』。
    • ex: */5 * * * * command
      • 每五分鐘進行一次,也可以寫成 0-59/5 ,相同意思。


[Note]
週與日月不可同時並存,
30 12 11 9 5 root echo "just test" <==這是錯誤的寫法


* 進行登錄檔的輪替 (log rotate):
  • Linux 會主動的將系統所發生的各種資訊都記錄下來,這就是登錄檔。 
  • 由於系統會一直記錄登錄資訊,所以登錄檔將會越來越大。
  • 我們知道大型檔案不但佔容量還會造成讀寫效能的困擾, 因此適時的將登錄檔資料挪一挪,讓舊的資料與新的資料分別存放,則比較可以有效的記錄登錄資訊。這就是 log rotate 的任務!這也是系統必要的例行任務。



* Reference
- 鳥哥的 Linux 私房菜 -- 例行性工作排程的建立 ***
- Crontab 的寫法(@reboot, @yearly...) | Tsung's Blog
- crontab 使用格式說明 **

沒有留言:

張貼留言