管理工作有时需要在特定时间执行某些指令,例如系统备份、资料库更新等工作会占用系统资源,如 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