第十五章 例行性工作排程(crontab)
15.1 什么是例行性工作排程
有的工作是例行性的,有的工作则是临时发生的。
15.1.1 工作排程的种类:at,cron
- at: at是个可以处理仅执行一次就结束排程的指令,不过要执行at时,必须要有atd这个服务的支援才行。
- crontab: crontab这个指令所设定的工作将会循环的一直进行下去可循环的时间为分钟、小时、每周、每月或每年等。crontab除了可以使用指令执行外,亦可编辑/etc/crontab来支持。至于让crontab可以生效的服务则是crond这个服务喔!
15.1.2 CentOS Linux系统上常见的例行性工作
- 进行登录档的轮替(log rotate)
- 登录文件分析logwatch的任务
- 建立locate的数据库
- man page查询数据库的建立
- RPM软件登录文件的建立
- 移除暂存档
- 与网络服务有关的分析行为
15.2 仅执行一次的工作排程
15.2.1 atd的启动与at运作的方式
systemctl restart atd # 重新启动atd这个服务
systemctl enable atd # 让这个服务开机就自动启动
systemctl status atd # 查阅一下atd目前的状态
- at的运作方式
事实上,我们使用at这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入/var/spool/at/目录内,该工作便能等待atd这个服务的取用与执行了。就这么简单。
我们可以利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制呢!加上这两个文件后,at的工作情况其实是这样的:
- 先找寻/etc/at.allow这个文件,写在这个文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at(即使没有写在at.deny当中)
- 如果/etc/at.allow不存在,就寻找/etc/at.deny这个文件,若写在这个at.deny的使用者则不能使用at,而没有在这个at.deny文件中的使用者,就可以使用at咯
- 如果两个文件都不存在,那么只有root可以使用at这个指令。
15.2.2 实际运作单一工作排程
at [-mldv] TIME
at -c 工作号码
选项与参数:
-m: 当at的工作完成后,即使没有输出讯息,亦以email通知使用者该工作已完成
-l: at -l相当于atq,列出目前系统上所有该用户的at排程
-d: at -d相当于atrm,可以取消一个在at排程中的工作
-v: 可以使用较明显的时间格式显示出at排程中的任务栏表
-c: 列出后面接的该工作的实际指令内容。
TIME:时间格式,这里可以定义出【什么时候要进行at这项工作】的时间,格式有:
HH:MM ex>04:00 在今日的HH:MM时刻进行,若该时刻已过,则明天的HH:MM进行此工作
HH:MM YYYY-MM-DD ex>04:00 2015-07-30
HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
HH:MM[am|pm] + number [minutes|hours|days|weeks] ex>now + 5 minutes ex> 04pm + 3 days
范例:
at now + 5 minutes
at> /bin/mail -s "testing at job" root < /root/.bashrc
at><EOF>
- at工作的管理
atq
atrm (jobnumber) - batch: 系统有空时才进行背景工作
其实batch是利用at来进行指令的下达啦!只是加入一些控制参数而已。这个batch神奇的地方在于:他会在CPU的工作负载小于0.8的时候,才进行你所下达的工作任务啦!
15.3 循环执行的例行性工作排程
循环执行的例行性工作排程则是由cron(crond)这个系统服务来控制的。
15.3.1 使用者的设定
与at同样的,我们可以限制使用crontab的使用者帐号喔!使用的限制数据有:
- /etc/cron.allow:
- /etc/cron.deny
当用户使用crontab这个指令来建立工作排程之后,该工作就会被记录到/var/spool/cron/里面去了,而且是以帐号来作为判别的喔!举例来说,dmtsai使用crontab后,他的工作会被记录到/var/spool/cron/dmtsai里头去!但请注意,不要使用vi直接编辑该文件,因为可能由于输入语法错误,会导致无法执行cron喔!
crontab [-u username] [-l|-e|-r]
选项与参数:
-u: 只有root才能进行这个任务,亦即帮其他使用者建立/移除crontab工作排程
-c: 编辑crontab的工作内容
-l: 查阅crontab的工作内容
-r: 移除所有的crontab工作内容,若仅要移除一项,请用-e去编辑。
预设情况下,任何使用者只要不被列入/etc/cron.deny当中,那么他就可以直接下达crontab -e
去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入vi的编辑画面,然后以一个工作行来编辑,编辑完毕之后输入“:wq”储存后离开就可以了!而每项工作(每行)的格式都是具有六个字段,这六个字段的意义为:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 指令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 指令 |
另外,还有一些辅助字符:
特殊字符 | 代表意义 |
---|---|
* | 任何时刻 |
,(逗号) | 分隔时段 |
-(减号) | 时间范围 |
/n | n为数字,亦即是"每隔n单位时间"的意思,例如*/5或0-59/5,每5分钟一次 |
15.3.2 系统的配置文件:/etc/crontab,/etc/cron.d/*
这个"crontab -e"是针对使用者的cron来设计的,如果是【系统的例行性任务】时,该怎么办呢?你只要编辑/etc/crontab这个文件就可以啦!
基本上,cron这个服务的最低侦测限制是【分钟】,所以【cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容】,因此,只要你编辑完/etc/crontab这个文件,并且将他储存之后,那么cron的设定就自动的会来执行了!
- crond服务读取配置文件的位置
一般来说,crond预设有三个地方会有执行脚本配置文件,他们分别是:- /etc/crontab
- /etc/cron.d/*
- /var/spool/cron/*