在 ubuntu 中,我們若需要建立定時的排程工作時(如:定時備份),可以使用 crontab 加入例行性排程,系統將會會定時執行相對應的工作。


在 ubuntu 中,決定使用者是否可以編輯自己 cron job 的設定檔為

  • /etc/cron.allow
    在此檔案中的使用者帳號將可編輯 cron job,若不在其中則無法使用。
  • /etc/cron.deny
    在此檔案中的使用者帳號將不可使用 crontab,若不在其中則可以使用。
    例:

    // one line, one account name
    user1
    user2
    

    PS.  預設會以 cron.allow 為優先。因此,通常只會選擇其中之一( cron.allow 或 cron.deny )做限制

接下來,介紹一下如何使用 crontab

crontab

-u [username] :只有 root 可以使用這個參數,可以新增或刪除其他使用的 cron job

-e:編輯自己的 cron job

-l:列出目前的 corntab

-r:移除目前所有的 cron job


來看看如何編輯自己的 cron job, crontab -e

#  m(分鐘) h(小時)  dom(日)  mon(月)  dow(周)   command(指令)
     0-59      0-23        1-31       1-12        0-7         [要執行的指令]

*:任何時候
,:多個時段
-:表示一個時間範圍
/n:每隔 n 個單位間隔

接下來就由例子來看吧

  • 每年的5月1日23:59,執行 test.sh

#  m(分鐘) h(小時)  dom(日)  mon(月)  dow(周)   command(指令)
         59         23         1             5            *            bash test.sh

  • 每週六與週日的23:59,執行 holiday.sh

#  m(分鐘) h(小時)  dom(日)  mon(月)  dow(周)   command(指令)
         59         23         *             *            6,7          bash holiday.sh

  • 每週一至週五的8:00,執行 morning.sh

#  m(分鐘) h(小時)  dom(日)  mon(月)  dow(周)   command(指令)
         0           8          *              *            1-5          bash holiday.sh

  • 每五分鐘執行一次 craw.sh

#  m(分鐘) h(小時)  dom(日)  mon(月)  dow(周)   command(指令)
         /5         *            *              *             *            bash craw.sh

看過以上例子後,應該大概知道用法如何

原則上,每個使用者的 cron job,都會被放至 /var/spool/cron/username

而 cron job 所執行的 log 檔則是在 /var/log/cron

若是需要用 root 執行的 cron job 則放在 /etc/crontab


接下來,我們來用之前介紹過的 rsync 搭配 crontab,定時備份我們的資料與資料庫

       在這之前,由於我底下的實作為遠端伺服器備份,因此必須先設定不須密碼登入的ssh

首先我們必須先編輯一個 shell script,backup.sh

#!/bin/bash
# mysql 資料庫備份為 mysql.sql
mysqldump -u [user] -p[password] --all-databases > mysql.sql
# 伺服器設定檔、網頁..等備份為 backup.tar.gz
tar -zcvf backup.tar.gz /etc /var/www /home /root mysql.sql
# 透過 ssh 將檔案備份至遠端伺服器 backup 資料夾
rsync -av -e ssh backup.tar.gz [user]@[遠端host]:~/backup

接下來,我們利用 crontab 將備份工作列入系統例行性排程(/etc/crontab)

# 每個月的一號早上六點執行備份的 shell script
m   h    dom  mon    dow     user     command
0   6     1    *      *      root    bash backup.sh

這樣就可以做系統的定時備份囉!

 

參考資料:

http://linux.vbird.org/linux_basic/0430cron.php

Leave a Reply