Cron 是個好用的 Linux 工具,可以用來定期自動化許多工作,就像 Windows 的排程管理員一樣。透過 Cron,可以輕鬆幫網站寫備份腳本。
Cron 可以讓你設定在每天的 12:30 分,或每個星期三的 09:00 等時間,執行不同的腳本、指令或程式。例如你可以設定每天自動清理垃圾檔案、每天自動整理 log 檔案、每兩個月執行一次 Let's Encrypt 的憑證更新 等等。
Cron 不需要安裝,絕大部分的 Linux 電腦都已內建這個東西。
如果你的主機不知怎的沒有的話,依然可以透過 apt-get 來安裝。
Cron 又稱為 Cronjob,也稱為 Crontab(Cron table),通常以這個指令開始編輯 Cron:
crontab -e
第一次使用可能會叫你設定編輯器,例如你要用 nano 還是 vim 打開 crontab 設定檔。如果你不知道這是什麼意思,就使用 nano 吧。
打開 cron 設定檔後,一開始應該會看到這樣的內容:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
和大部分的設定檔一樣,#
開頭都是註解的意思。從最後一行和範例可以知道,前幾個選項分別是 m
、h
、dom
、mon
、dow
和 command
,依序是 minute(分)、hour(時)、date of month(每月第幾天)、month(月)、day of week(星期幾)和要執行的指令。例如範例的
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
指的就是任意月(mon)、任意天(dom)的星期一(dow)的 5 點(h)0 分(m),執行 tar -zcf /var/backups/home/tgz /home/
這個指令。
如果一開始覺得時間很難算,可以試試看 Crontab Guru 這個網站,只要輸入前面五個選項,就會幫你轉成人類可讀時間。
最後離開文字編輯器,Cron 就會自動生效。
Cron 很適合拿來備份主機,例如搭配前面提到的 MongoDB 備份與還原,可以在每個月的一號執行備份,也可以執行日行備份。雖然備份不會影響到資料庫操作,但我習慣在半夜備份:
0 3 1 * * mongodump -d blog -o /home/noob/blog-backup$(date '+%Y-%m-%d')
另外,如果你有一些使用者上傳的檔案需要備份,可以使用 tar
指令來打包。例如如果你要把 /var/www/html/wordpress
都包起來的話,可以使用:
0 3 1 * * tar zcf /home/noob/wordpress$(date '+%Y-%m-%d').tgz /var/www/html/wordpress
來打包成一個 tar.gz 檔案。
本篇文章同步發表在 Noob's Space。