crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较高,一个要求你的程序是24X7小时不宕机,一个是要求你的调度程序比较可靠,实际工作中,90%的程序都没有必要花这么多时间和精力去解决上面的两个问题的,只需要写好自己的业务逻辑,通过crond这个工业级程序去调度就行了,crond的可靠性,健壮性,大家应该是毫无疑问的。
crontab简易入门
假设我要设置一个任务,每分钟就要做一个数据同步,这个同步脚本的路径是/home/blue/do/rsyncfile.sh,那么我可以在这么配置,使用blue用户,在终端输入
crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
#分 时 日 月 周
<==============任务的完整命令行
* * * * * /home/blue/do/rsyncfile.sh
默认情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后输入『 :wq』储存后离开 vi 就可以了!
假如我们需要修改为每5分钟运行数据同步的脚本,那么同样使用 crontab -e 进入编辑:
*/5 * * * * /home/blue/do/rsyncfile.sh
假如服务器出了问题,有一天的数据没有同步,于是我们就需要补数据了,假设这个补数据的脚本是/home/blue/do/rsyncfile_day.sh,但是白天是高峰期,晚上用户不多,是低峰期,我们补数据会占用大量带宽,尤其是白天,会影响正常业务,所以一般我们可以让补数据任务在凌晨2点开始跑,那么同样使用crontab -e 进入编辑:
0 2 1 4 * /home/blue/do/rsyncfile_day.sh
这样,在4月1号凌晨2点0分就会开始启动我们的补数据的脚本了。
同步数据,在互联网公司是再平常不过的任务了,这里大家可以看到crontab的魅力所在了,只需要写最简单的业务逻辑,把调度交给crond做,就完成了一个可靠性很高的一项任务了,如果要自己去额外写这种调度程序,不知道要花多少精力才能做到可靠稳定。
crontab的语法
crontab [-u username] [-l
-e
-r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
查询使用者目前的 crontab 内容:
crontab -l
*/5 * * * * /home/blue/do/rsyncfile.sh
0 2 1 4 * /home/blue/do/rsyncfile_day.sh
清空使用者目前的 crontab:
crontab -r
crontab -l
no crontab for blue
如果你想删除当前用户的某一个crontab任务,那么使用crontab -e进入编辑器,再删除对应的任务。
crontab的限制
/etc/cron.allow:将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用crontab;
/etc/cron.deny:将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用crontab 。
以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先,而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在配置上面的判断!一般来说,系统默认是保留/etc/cron.deny ,你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny当中,一个帐号一行!
/etc/crontab配置文件讲解
『 crontab -e 』是针对使用者的 cron 来设计的,如果是『系统的例行性任务』时,就要编辑 /etc/crontab这个文件。
那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个运行档,但是/etc/crontab 可是一个『纯文字档』,必须用 root 的身份编辑一下这个文件。
首先我们要来看看crontab的文件内容
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the`crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have usernamefields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report/etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron
( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron
( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron
( cd / && run-parts --report /etc/cron.monthly )
这个文件与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同
PATH=....:
这里就是输入运行档的搜寻路径!使用默认的路径配置就已经很足够了!
17 * * * * root cd / && run-parts --report/etc/cron.hourly: