分类:
2012-02-22 21:08:16
原文地址:cron服务学习 作者:sunjiangang-ok
1. crontab介绍
crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。
crontab主要有4个参数:
-l #列出某个用户的cron服务的详细内容
-u #设定某个用户的cron服务,一般是root用户使用此选项
-r #删除某个用户的cron服务
-e #编辑某个用户的cron服务
2. cron介绍
cron是一个Linux下的定时执行工具,可以在无需人工干预的情况下运行作业。cron由crond守护进程和一组表(crontab文件)组成。由于cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
cron服务提供了crontab命令来设定cron服务的。
3. crond介绍
crond是crontab的一个守护进程。d代表daemon,守护进程是生存期比较长的一个进程,一般linux下的一个进程都是和一个终端中运行着,终端一关闭,进程也就退出,但是守护进程一般是在系统装入时启动,在系统关闭时结束,在系统的后台运行着。
4. cron工作原理
crond守护进程是在系统启动时由init进程启动的,受init进程的监视,如果它不存在了,会被init进程重新启动。这个守护进程每分钟唤醒一次,并通过检查crontab文件判断需要做什么。
每个用户有一个以用户名命名的crontab文件,存放在/var/spool/cron/crontabs目录里。若管理员允许或者禁止其他用户拥有 crontab文件,则应编辑/etc/下面的cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件。每一 个用户都可以有自己的crontab文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。
用户使用crontab命令(注意crontab可以指文件,也是一个命令)管理自己的crontab文件。
1) 更新crontab文件——crontab filename
用来更新当前用户的crontab文件。注意:只是将filename指定的文件中的crontab条目写入用户的crontab文件(以用户名命名)中并 清空crontab文件原来的条目,并不是将filename指定的文件复制/var/spool/cron/crontabs目录;
2) 列出crontab文件——crontab -l
列出当前用户的crontab文件的crontab条目;
3) 编辑crontab文件——crontab –e
编辑当前用户的crontab文件;
4) 删除crontab文件——crontab –d
删除当前用户的crontab文件。
5. crontab命令的时间编辑格式举例
a) 每天早上9:10执行:10 9 * * *
b) 每两小时分执行一次:10 */2 * * *
c) 晚上11点到早上9点,每两个小时执行一次:0 23-9/2 * * *
6. crontab不执行
crontab有时候会因为环境变量的问题不能执行命令,这个要执行的命令被送入sh去执行,这个shell只有USER,HOME,SHELL这三个环境变量,因此在这里填写命令的时候,最好写命令的绝对路径。另外,每条JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。
7. crond的配置文件/etc/crontab
这个文件当中主要存放了系统运行的一些调度程序。
说明:
SHEL=/bin/bash #基于什么shell来运行
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#指定目录中有文件命令时候,不需要指明全路径
MAILTO=root #使用cron命令时,通过邮件的方式通知root用户
HOME=/ #与/etc/crontab相关的主目录为根目录
上面四行主要任务运行时一些环境变量的设置,下面的内容就是任务运行的时间和任务了:
命令可以是 ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本。
例如:
# run-parts
* * * * * root ls /proc >> /tmp/proc
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
其中run-parts命令是指出运行指定目录下的某个脚本。
注意:时间后面是有一个用户的名字的,如果没有这个用户名字,那么这个命令或者脚本是不会被执行的,之前我就犯过这样的错误。
8. 用户自己的cron
每一个用户可以设置自己的cron服务,只要这个用户没有在/etc/cron.deny表中就可,他就可以使用crontab –e命令来编辑自己的cron文件。
用户自己编辑的cron服务,是在/var/spool/cron/User_name文件中记录滴。。。
9. cron的访问控制
默认情况下,所有用户都能访问cron,要对cron进行访问控制,是通过/etc/cron.allow文件和/etc/cron.deny文件进行的。如果这两个文件都不存在的时候,表示所有的用户都可以访问cron工具;cron.allow文件的优先权高于cron.deny文件,也就是说,如果同时存在这两个文件,那么cron.deny文件就失效了,只有cron.allow文件起作用。
cron.allow和cron.deny就是用户名的列表,每行一个用户名。
10. /etc/crontab文件与/etc/cron.d目录
如果某cron任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和/etc/crontab中一样的语法。
这里的“根据调度来执行”时什么意思啊?我还是不能理解,经过测试,我得出的结论是,这个目录下的文件和crontab文件的执行效果是一样的╮(╯▽╰)╭。
11. 使用at命令运行一次
使用cron的缺点是任务要经常运行,如果我们要让任务运行一次的时候,可以使用at命令。
at now + 1 minutes #1分钟后执行at任务
atq #查询at的任务
atrm No. #删除指定编号的at任务
参考资料:
(1) crond:
(2) crontab命令的使用及自我体会: