深入学习crontab 的原理
crontab
crond 服务管理
crontab 命令式需要 crond 服务支持的, crond 服务同样是独立的服务.
一般情况下, crond 服务都是默认自启动的, 如果服务器上有循环执行的系统定时任务, 就不要关闭crond 服务 .
crond 访问控制
crond服务中,也是有白名单(/etc/cron.allow )和黑名单文件(/etc/cron.deny)的, 默认只创建了黑名单文件 .
如果同时有白名单和黑名单文件, 那么黑名单文件就会失效, 白名单文件生效(不在白名单中的用户,不能用crond 服务, 这个规则不能约束root )
其实规则和 at 一模一样.
通过命令实现定时任务
每个用户都可以实现自己的crontab 定时任务, crontab -e 之后,就会进入编辑页面, 保存退出和vim 一样.
crontadb [选项]
选项:
-e: 编辑crontab定时任务
-l: 查询crontab任务
-r: 删除当前用户所有的crontab 任务,如果有多个任务,只想删除一个, 可以用 crontab -e
-u username: 修改或删除其他用户的crontab任务. 仅仅只有root 可用
crontab -e 的使用细节
crontab -e
# 进入crontab 编辑界面, 会打开vim 编辑你的工作
* * * * * 执行的任务
项目 含义 范围
第一个"*" 一小时中第几分钟 0-59
第二个"*" 一天中第几个小时 0-23
第三个"*" 一个月中的第几天 1-31
第四个"*" 一年当中第几个月 1-12
第五个"*" 一星期中的星期几 0-7(0和7都是代表星期日)
在时间表示的时, 还有一些特殊符号需要学习
特殊符号 含义
* 代表任何时间. 比如第一个 "*" 就代表一小时中每分钟都执行一次的意思
, 代表不连续的时间. 比如 "0 8,12,16 * * * "就代表每一天的8点0分, 12点0分,16点0分都执行一次
- 代表连续的时间范围. 比如 "0 5 * * 1-6" , 代表在周一到周六的凌晨 5点0 分执行命令
*/n 代表每隔多久执行一次. 比如 "*/10 * * * * " 命令, 代表每隔十分钟就执行一次
通过配置文件来实现定时任务
因为使用crontab -e 命令定义任务时, 默认身份是当前用户, 而修改 /etc/crontab 配置文件时, 定时任务的执行者身份是可以手工指定的.
通过配置文件来实现, 有个好处, 就是使用低权限的用户来执行的时候, 如果遇到报错, 可能 就会停下来了, 危险性较小.
方法一: 根据需求编写好shell 脚本, 然后把这些 shell 脚本文件复制到 /etc/crond.{daily, weely, monthly } 目录中的任意一个
方法二: 就是修改 /etc/contab 这个配置文件, 自己加入自己的定时任务, 不过需要注意的是指定脚本的执行者身份
/etc/contab在centos5.x 和 centos6.x 中的不同
Centos5.x中 , 是通过 run-parts脚本执行 /etc/cron.{daily, weekly, monthly } 目录中的所有文件.
centos6.x中的 /etc/crontab 文件和 centos5.x 不一样,
这几个目录, 在新版本中,依然还是会调用, 只是centos6.x中用 anacron 进行调用(anacron 的好处是如果因为意外情况,如当机或者重启等, 没有执行的定时任务,
后面系统恢复正常后会进行重新调用, 而 cron 是不会的)
对于用户来说,其实并不用在意这个定时任务是由哪个程序调用的, 我们只需要知道如何使用 crontab 设置,
方法一: 根据需求编写好shell 脚本, 然后把这些 shell 脚本文件复制到 /etc/crond.{daily, weely, monthly } 目录中的任意一个.
方法二: 就是修改 /etc/contab 这个配置文件, 自己加入自己的定时任务, 不过需要注意的是指定脚本的执行者身份
anacron学习(了解即可)
作用: 解决了因为服务器异常而没有执行的定时任务的问题,会在系统恢复正常后找个时间进行 任务补发.
这个 anacron 服务, 是默认开机自启动的, 我们一般顶多就是改改配置文件, 但是改动的可能性较少,如果有需要,到时候百度一下即可.
crontab 的注意事项
六个选项都不能为空, 必须要写,不确定的使用"*" 代表任意时间
crontab定时任务, 最小的有效时间是分钟, 最大的时间范围是月.
在定义时间的时候, 日期和星期最好不要在一条定时任务中出现,因为它们 都是以天作为单位
在定时任务中, 不管是直接写命令, 还是在脚本中写命令, 最好的都是使用绝对路径,有时候相对路径会报错.