管理工作有時需要在特定時間執行某些指令,例如系統備份、資料庫更新等工作會佔用系統資源,如 CPU 與磁碟機等,因此這類工作應該避免在白天執行,最好排定在晚間或凌晨執行。

CentOS 安裝完成後,開機會自動啟動 crond 服務,crond 是 Linux 的排程服務,負責每分鐘檢視是否有指定工作需要執行。 crond 會讀取排程設定檔 /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

☛ 環境設定

SHELL 設定當排程工作執行時所使用的 shell 程式,預設是 bash。 PATH 則是排程工作執行時的搜尋路徑,若執行檔不在上述路徑中,會產生找不到檔案的錯誤。 MAILTO 則是會將執行排程工作的輸出訊息以電子郵件寄送給本機的使用者。

☛ 排程工作

排程工作時間的訂定方法有’分鐘‘、’小時‘、’日‘、’月‘與’星期‘五個值可以訂定,接著是執行帳號角色與執行指令兩個值,之間以空白隔開:

欄位 說明
1 第一個欄位代表’分鐘’,值為 0 到 59 。
2 第二個欄位代表’時’,值為 0 到 23 。
3 代表’日’,由每月的 1 到 31 日。
4 代表’月’,由 1 月到 12 月。
5 代表’星期’,0 與 7 都代表星期日,星期一到星期六 ( 1 至 6 ) 。
6 以哪個帳號角色來執行該項排程工作。
7 排程工作指令。

 ☛ 系統預設訂定排程工作檔

系統預設已訂定四個排程工作,分別是每小時、每天、每周與每月需執行的工作,已分別指定了『排程工作檔』,有需要時可直接將執行指令新增至所屬工作檔中:

排程工作 設定檔 排程工作檔
星期
每小時的第一分鐘 01 * * * * crond.hourly
每天 4 點 02 分 02 04 * * * crond.daily
每星期日的 4 點 22 分 22 04 * * 0 crond.weekly
每月 1 號的 4 點 42 分 42 04 1 * * crond.monthly

☛ 自定系統備份

使用 gedit 在 /usr/sbin 目錄下建立 backup.sh 檔案:

[root@localhost ~ ]# gedit /usr/sbin/backup.sh

將所欲執行的指令寫在檔中,如下:

#備份 /var/www/html 目錄下的所有檔案
tar zvcf /home/simon/backup/Backup-web-$(date '+%y-%m-%d').tar.gz /var/www/html
#備份 /var/lib/mysql 目錄下的所有檔案
tar zvcf /home/simon/backup/Backup-mysql-$(date '+%y-%m-%d').tar.gz /var/lib/mysql
#備份 /var/mail 目錄下的所有檔案
tar zvcf /home/simon/backup/Backup-email-$(date '+%y-%m-%d').tar.gz /var/mail

存檔後,變更 backup.sh 的許可權設定,如下:

[root@localhost ~ ]# chmod 755 /usr/sbin/backup.sh

最後,使用 gedit 修改 /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
#每周日中午 12:00 以 root 角色开始执行備份工作
0 12 * * 7 root /usr/sbin/backup.sh

存檔後,重新啟動 crond 服務,便完成了排程設定,如下:

[root@localhost ~ ]# systemctl restart crond.service