Linux系统中crontab命令的使用
我们在使用系统的过程中,经常需要在以后的某个时间点执行一个任务,而我们又不在机器旁边的时候,比如在半夜时服务器访问的用户很少,宽带资源很充足的时候,要去镜像软件包、重启服务器(虽然Linux很稳定)等,或者需要服务器在每天的特定时间去备份数据库或者做其它周期性的任务。
这时就需要任务计划去满足我们的需求,在Linux中任务计划分为一次性任务计划和周期性任务计划,只在某个时间点执行一次的任务计划,比如:下载镜像、重启服务器等就用一次性任务计划。而需要周期性、重复执行的任务就用周期性任务计划需用crontab命令。
crontab是用来创建周期性任务计划的。也就是说那些需要重复执行的任务就需要用到它,那它是如何实现周期性的呢?在系统中有一个叫crond的守护进程。就是因为它的存在,才得以让我们可以很放心的把这么重要的任务交给它去执行。而cron又分为系统cron和用户cron。
系统cron在/etc/crontab文件中有其详细定义,只要我们按照这个格式去创建任务计划。系统就能很愉快的工作。那么它的格式是什么呢?请看下图:
有没有觉得晕?没关系,其实它已经很明确的告诉你要怎么去创建一个任务计划了。但这里我们只是去看这里的字段都是一些什么含义,而不建议去直接修改这个文件。具体什么原因你懂的,Linux可不会阻止你自杀的。比如:rm -rf /这个命令你可以很轻松的去执行,但后果可是很严重的。下面说说里面字段的含义:
SHELL=/bin/bash:用于解释执行任务计划里面的命令的解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin:PATH环境变量,shell执行命令时会以这些路径下去寻找命令的路径。
MAILTO=root:任务计划的结果发送给谁。
下面的5个*号从左至右分别代表的是分、时、日、月、周。紧接着的是要执行的命令,在写命令时建议使用命令的绝对路径,以免在执行时不能正确解释执行。
那我们要怎样去定义一项任务呢?在这之前先说说*号的有效取值范围以及如何去表示它们:
1.每个时间位都应该使用其可用的有效取值范围内的值;
2.某时间位上的*号表示对应位的所有有效取值;
3.-:连续的时间点取值,如:30-35 7 * * *
4.,:离散的时间点取值,如:5,35 * * * *
5./#:表示在指定范围时间内每隔#一次,如:5-45/3 * * * *
在此文件中每一行表示一个独立的任务。
用户cron是普通用户和管理员(强烈建议用此种方式创建任务计划)以安全的方式创建任务计划的,因为在保存退出后,crontab命令会检查命令是否有语法错误。创建成功后会在/var/spool/cron/目录下创建一个同用户名的文件。而crontab的用法也很简单,在命令后跟上-e 选项就可以创建任务计划。
例:每周2、4、6的凌晨3点02分把/etc目录下的文件备份至/backup目录下并以etc_开头后面跟上当天的日期。而后保存即可(友情提示:在命令中使用%时,要记得转义,或者用引号。)。如下图:
查看自己的cron任务列表,使用-l选项。如下图就是刚刚创建的任务计划。
那么要删除任务计划怎么办?对此我们直接用crontab -e去编辑/var/spool/cron/目录下的文件。如果连这个文件都不想要了?那好办,执行crontab -e后这个文件就被删除,从此一切烦恼就随往事烟消云散了。
当然身为管理员无时无刻不体现着特权,使用-u选项还可以别的用户创建任务计划。请看下图
上图创建了一个每天6、9、12、15、18点查看当前系统挂载的所有文件系统,并将结果追加至/tmp/mounts.txt文件中的任务。
-u选项还可以配合-l、-r选项实现查看和移除任务计划。
如果我们创建的任务计划在某天不能正常的执行,比如系统宕机、重启等,别担心还有一个小工具:anacron。
anacron是cron的补充,它的主要功能就是去检查crontab中的任务在过去的一个周期内是否有成功执行。如果没有执行,则在开机以后在系统的某个时间点内让其执行一次,无论周期是否到达。
anacron很完美的解决了我们的忧虑。