cron小结
- 格式:docx
- 大小:46.69 KB
- 文档页数:3
Cron小结
一,概述
UNIX和Linux系统的系统调度程序叫做cron。
它的作用是按照预先确定的时间表执行单个命令、命令序列或者脚本。
通常这些任务是在基本不停机的系统上运行的。
通过编写cron 脚本,很容易就可以实现定时进行系统维护、备份、同步、监控或者其他的需要按照时间表来执行的任务。
二,说明
在UNIX或Linux系统中,cron的daemon进程一直在运行。
系统启动时,执行控制(rc)脚本会启动crond这个守护进程。
之后这个进程在系统范围内或者某个用户的crontab文件中搜索相关的条目并将他们装入内存。
cron daemon会以每分钟一次的频率检查并确定是否执行某个条目。
每次用户的crontab文件发生改变时,系统都重新将新的crontab文件调入内存。
用户的crontab文件通常都放在/var/spool/cron/目录下,并以用户名命名。
当用户执行crontab -e来编辑例行性任务的时候,其实就是在编辑这个文件。
当然,并不推荐直接编辑这个文件,因为可能由于输入语法等错误导致无法运行cron。
一个crontab条目是crontab 文件中具有特殊格式的一行,它指定一个月或一周内的某一天的某一小时的某一分钟执行某个特定的任务。
cron也具有配置文件,一般来说系统开始时不存在/etc/cron.allow文件,而一旦存在这个文件,则不在这个文件内的用户无法使用crontab;与之相反,系统开始时一般存在/etc/cron.deny这个文件,文件中的用户无法使用crontab。
cron执行的每一项工作都会被记录到/var/log/cron这个日志文件中,所以当需要了解cron命令执行情况的时候可以查看这个文件。
三,使用
用户通过使用crontab命令建立例行性工作。
crontab使用格式如下:
crontab [-u username] [-l|-e|-r]
-u:只有root才能使用,帮助其他用户创建和删除crontab工作调度。
-e:编辑crontab的工作内容。
-l:查阅crontab的工作内容。
-r:删除所有的crontab的工作内容。
如果仅需删除部分,请使用-e进行编辑。
执行crontab -e命令后转入例行性工作调度的编辑界面,每个任务占一行。
没行可以分为六个域,从前到后依次为:分,时,天,月,周,命令,各个域用空格分开。
在一个域中,除了直接指定时间之外可以有以下其他符号:“*”,代表时刻都接受的意思;“,”,代表分割时段的意思,比如在每天3点和15点执行命令,则可以写成“* 3,15 * * * command”;“-”,代表一段时间范围内,比如每天8点到12点之间每小时的20分都执行一次动作,就可以写
为“20 8-12 * * * command”,记住cron进程是每分钟检测一次的,所以执行最小粒度是分钟;“/n”,代表每隔n单位间隔执行一次。
四,注意
1,cron调度任务时环境和平时所处的交互环境不同。
比如写了一个创建文件的脚本,脚本中创建文件的时候没有指定路径。
当直接在bash 等环境中运行的时候,执行脚本所创建的文件在当前工作目录下。
然而,如果是同cron进程来调度脚本,那么创建出来的文件在用户的家目录下。
由此可见,在一般的交互环境中脚本执行时所拥有的默认路径是当前工作目录,而是用cron调度时默认路径是家目录。
所以在编写需要通过cron调度的脚本的时候,所有的路径都要是用绝对路径。
另外,cron进程调度脚本所处的环境和bash等交互环境存在很大不同。
通过如下例子来说明:编写一个脚本,如下:
直接执行时结果如下:
通过cron调度:
得到的结果为:
由此可见,cron进程调度脚本时所拥有的环境和交互环境中所拥有的环境有很大的不同。
所以在编写脚本的过程中,如果对环境有较大的依赖,那么在使用cron daemon调度的时候一定要在脚本中指明了需要的环境变量,否则可能执行失败。
2,crontab文件中时间域中“/n”的使用。
首先看一个实验:
结果:
可以预料,以后这个调度的执行依然会在每个小时的0分和58分的时候。
可见,并不是说”/n”可以让脚本严格的按照每过n个时间单位就执行一次。
实际上,cron应该并不记录上次执行时间,所以也不会计算每过多长时间执行一次。
cron决定一个动作是否执行的唯一时间标准就是当前时间是否符合项目中定义的时间。
个人觉得对于存在“*“的域来说,cron是将”*“替换成当前对应时间,然后计算结果并查看其是否为整数。
如果域中只有”*“,那么当然结果就是当前时间,肯定是一个整数,如果带有”/n“的话,比如上例,只有分钟为58和0的时候可以计算出来为整数的结果。
我不知道是否用人使用crontab来代替时间较长同时要求不高的sleep命令,但是这绝对是错误的。
五,范例
网上的例子够多了,不赘述。
六,总结
crontab命令在工作中还是比较简单和常用的命令,但是细节上问题容易被忽略,常常导致新手刚开始的几次例行性调度出现问题。
本文面向初学者以及需要使用crontab命令但不必要深入的用户,简要的介绍了crontab这个命令和cron守护进程,并指出了一个常见的问题(四,1)和容易存在误解的地方(四,2)。
参考文献:
[1]鸟哥著,王世江改编:《鸟哥的linux私房菜基础学习篇》
[2]Ron Peters 著,李晓群付弘宇译:《shell脚本专家指南》。