青蛙学Linux—crond和crontab
1、简介
crond是Linux下周期执行任务的一个守护进程,类似Windows下的任务计划。crond会定期(默认每分钟)检查系统中是否有要执行的任务工作,如果有,就会根据改任务的设定来执行此项任务。而crontab就是用来对任务进行设置的。
在Linux下,任务调度分为两类,分别为系统任务调度和用户任务调度。
系统任务调度相关文件和目录:
# 系统任务配置文件 /etc/crontab # 相应目录下的文件 /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly
用户任务调度相关文件:
# 用户可以使用crontab工具来定制自己的任务计划。用户的crontab文件保存在以下目录中,以用户名命名 /var/spool/cron
权限控制配置文件:
/etc/cron.allow # 允许用户设置crontab /etc/cron.deny # 禁止用户设置crontab # /etc/cron.allow可能不存在,如果存在,则/etc/cron.allow的优先级高于/etc/cron.deny # 这两个文件的配置非常简单,只要在里面加上允许或禁止的用户的用户名即可
任务执行日志文件:
# 可以通过该文件查看任务是否正常执行 /var/log/cron
2、任务计划设置工具crontab的使用
crontab用于设置任务计划,使用该命令设置任务计划时,会用进入Vi编辑器。命令语法如下:
crontab [-u 用户] [文件]|[选项]
参数含义:
- -u:指定设置某个用户的任务计划,此参数一般由root运行。不设置时默认为当前用户设置任务计划
- 文件:将指定文件作为crontab的任务列表并载入crontab。如果没有指定文件,crontab将接受标准输入上键入的命令
常用选项:
- -e:编辑用户的crontab文件
- -l:显示用户的crontab文件内容
- -r:从/var/spool/cron目录中删除用户的crontab文件
- -i:在删除用户的crontab文件时提示确认
3、crontab编写格式
crontab文件需要按照一定的格式编写才可以正确的执行用户制定的任务计划。我们先来看下/etc/crontab文件中的内容:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
字段详解:
- SHELL:使用的shell
- PATH:系统执行命令的路径
- MAILTO:执行信息发送邮件给用户
除去上面的字段,接下来就是crontab的编写格式了:
minute hour day month week [user-name] [run-parts] command
- minute:分钟,可以是从0到59之间的任何整数
- hour:小时,可以是从0到23之间的任何整数
- day:日期,可以是从1到31之间的任何整数
- month:月份,可以是从1到12之间的任何整数
- week:星期,可以是从0到7之间的任何整数(星期日可以表示为0或7)
- user-name:执行任务的用户,配置/etc/crontab文件时可以设置,使用crontab命令为指定用户设置时不用配置该项
- run-parts:一次性执行目录下的所有脚本
- command:要执行的命令或脚本
以上各个字段中,还可以使用以下特殊字符:
- *:代表所有的值
- ,:用逗号隔开的值指定一个列表,如1,3,5表示1,3和5
- -:表示一个整数范围,如1-5表示1,2,3,4,5
- /:指定时间的间隔频率,如minute字段的*/3表示每三分钟执行一次
一些例子:
# 每隔一分钟执行一次/data/run.sh */1 * * * * /data/run.sh # 每天的3点执行一次/data/run.sh 0 3 * * * /data/run.sh # 在每周五的三点半执行一次/data/tun.sh 30 3 * * 5 /data/run.sh
4、一些注意事项
4.1、环境变量的问题
在crontab配置中,执行的命令或脚本最好使用绝对路径,以避免使用相对路径带来的环境变量问题;或者在执行的脚本中事先引入环境变量。
4.2、运行结果不输出邮件
crontab在执行任务时,如果执行的命令或脚本有输出,则会通过邮件的形式输入到位于/var/mail目录下的邮件日志中(以用户名命名),如果不想获得输出,则可以使用重定向:
* * * * * command>/dev/null 2>&1
4.3、系统级任务与用户级任务
用户级的任务可以放到系统级任务调度中完成,但是系统级的任务无法使用用户级来调度。