http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.htmlhtml
经过crontab 命令,咱们能够在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位能够是分钟、小时、日、月、周及以上的任意组合。这个命令很是适合周期性的日志分析或数据备份等工做。java
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
分 时 日 月 星期 要运行的命令python
向cron进程提交一个crontab文件以前,首先要设置环境变量EDITOR。cron进程根据它来肯定使用哪一个编辑器编辑crontab文件。9 9 %的UNIX和LINUX用户都使用vi,若是你也是这样,那么你就编辑$HOME目录下的. profile文件,在其中加入这样一行:linux
EDITOR=vi; export EDITOR
而后保存并退出。不妨建立一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入以下的内容。shell
# (put your own initials here)echo the date to the console every
# 15minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console
保存并退出。注意前面5个域用空格分隔。apache
在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。若是系统崩溃或挂起,从最后所显示的时间就能够一眼看出系统是什么时间中止工做的。在有些系统中,用tty1来表示控制台,能够根据实际状况对上面的例子进行相应的修改。为了提交你刚刚建立的crontab文件,能够把这个新建立的文件做为cron命令的参数:ubuntu
$ crontab davecron
如今该文件已经提交给cron进程,它将每隔1 5分钟运行一次。同时,新建立文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。vim
使用-l参数列出crontab文件:bash
$ crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1
可使用这种方法在$HOME目录中对crontab文件作一备份:编辑器
$ crontab -l > $HOME/mycron
这样,一旦不当心误删了crontab文件,能够用上一节所讲述的方法迅速恢复。
若是但愿添加、删除或编辑crontab文件中的条目,而EDITOR环境变量又设置为vi,那么就能够用vi来编辑crontab文件:
$ crontab -e
能够像使用vi编辑其余任何文件那样修改crontab文件并退出。若是修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。若是其中的某个域出现了超出容许范围的值,它会提示你。 咱们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm {} \;
保存并退出。
注解
最好在crontab文件的每个条目之上加入一条注释,这样就能够知道它的功能、运行时间,更为重要的是,知道这是哪位用户的定时做业。
$crontab -r
* * * * * myCommand
3,15 * * * * myCommand
3,15 8-11 * * * myCommand
3,15 8-11 */2 * * myCommand
3,15 8-11 * * 1 myCommand
30 21 * * * /etc/init.d/smb restart
45 4 1,10,22 * * /etc/init.d/smb restart
10 1 * * 6,0 /etc/init.d/smb restart
0,30 18-23 * * * /etc/init.d/smb restart
0 23 * * 6 /etc/init.d/smb restart
* */1 * * * /etc/init.d/smb restart
* 23-7/1 * * * /etc/init.d/smb restart
有时咱们建立了一个crontab,可是这个任务却没法自动执行,而手动执行这个任务却没有问题,这种状况通常是因为在crontab文件中没有配置环境变量引发的。
在crontab文件中定义多个调度任务时,须要特别注环境变量的设置,由于咱们手动执行某个任务时,是在当前shell环境下进行的,程序固然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,所以,就须要在crontab文件中指定任务运行所需的全部环境变量,这样,系统执行任务调度时就没有问题了。
不要假定cron知道所须要的特殊环境,它其实并不知道。因此你要保证在shelll脚本中提供全部必要的路径和环境变量,除了一些自动设置的全局变量。因此注意以下3点:
脚本中涉及文件路径时写全局路径;
脚本执行要用到java或其余环境变量时,经过source命令引入环境变量,如:
cat start_cbp.sh
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
当手动执行脚本OK,可是crontab死活不执行时,极可能是环境变量惹的祸,可尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
每条任务调度执行完毕,系统都会将任务输出信息经过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会很是大,可能会影响系统的正常运行,所以,将每条任务进行重定向处理很是重要。 例如,能够在crontab文件中设置以下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,而后将标准错误重定向到标准输出,因为标准输出已经重定向到了/dev/null,所以标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
系统级任务调度主要完成系统的一些维护操做,用户级任务调度主要完成用户自定义的一些任务,能够将用户级任务调度放到系统级任务调度来完成(不建议这么作),可是反过来却不行,root用户的任务调度操做能够经过”crontab –uroot –e”来设置,也能够将调度任务直接写入/etc/crontab文件,须要注意的是,若是要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即便在root用户下建立一个定时重启系统的任务也是无效的。
新建立的cron job,不会立刻执行,至少要过2分钟才执行。若是重启cron则立刻执行。
当crontab失效时,能够尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的全部crontab都没了。
在crontab中%是有特殊含义的,表示换行的意思。若是要用的话必须进行转义%,如常常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。
更新系统时间时区后须要重启cron,在ubuntu中服务名为cron:
$service cron restart
ubuntu下启动、中止与重启cron:
$sudo /etc/init.d/cron start
$sudo /etc/init.d/cron stop
$sudo /etc/init.d/cron restart
---------------------------------------------------------------------------------------------------------------------
若是让crond在开机时运行,应该改变其运行级别:
chkconfig –level 35 crond on
service crond status查看cron服务状态,若是没有启动则service crond start启动它,cron服务是一个定时执行的服务,能够经过crontab命令添加或者编辑须要定时执行的任务。
在使用时,会用到几种辅助字符,先说明以下:
特殊字符 |
意义 |
* |
表明任意匹配,例如“ |
, |
表明分割时段,好比每10分钟执行一次命令?可使用 0,10,20,30,40,50* * * * command 参数栏数不变,可是第一栏是0,10,20,30,40,50,以逗号(,)分割。 |
- |
表明一段时间范围内,好比工做日(周一至周五)凌晨1点执行某一个命令? *1 * * 1-5 command 第五栏为1-5,表明1,2,3,4,5都适用的意思。 |
/n |
n表明数字,为每隔n单位间隔。例如上文逗号(,)中举例,每10分钟执行一次命令,能够这样写: */10* * * * command 第一栏为*/10,不要忘了*不能省略。 |
使用crontab -e命令,打开任务程序文件,而后删除指定的任务便可。
crontab文件位置:
Linux在相应用户下,用crontab -l 命令能够查看该用户定时执行的任务,-e能够编辑,可是其真实文件在哪儿呢??
以CentOS为例,其真实的位置在:/var/spool/cron下面,有执行定时任务的用户将会有以该用户命名的一个文档,vim该文档与用命令crontab -l看到的同样。
crontab命令
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把须要执行的命令序列放到crontab文件中以得到执行。每一个用户均可以有本身的crontab文件。下面就来看看如何建立一个crontab文件。
在/var/spool/cron下的crontab文件不能够直接建立或者直接修改。crontab文件是经过crontab命令获得的。如今假设 有个用户名为foxy,须要建立本身的一个crontab文件。首先可使用任何文本编辑器创建一个新文件,而后向其中写入须要运行的命令和要按期执行的 时间。
而后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:
crontab test.cron
这样一个crontab 文件就创建好了。能够转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容能够发现文件头有三行信息:
#DO NOT EDIT THIS FILE -edit the master and reinstall.
#(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是:
#切勿编辑此文件——若是须要改变请编辑源文件而后从新安装。
#test.cron文件安装时间:14:20:20 02/22/1999
若是须要改变其中的命令内容时,仍是须要从新编辑原来的文件,而后再使用crontab命令安装。
可使用crontab命令的用户是有限制的。若是/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;若是该文件不存 在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;若是两个文件都不存在,那就取决于一些参数的设置,多是只 容许超级用户使用该命令,也多是全部用户均可以使用该命令。
Linux中,周期执行的任务通常由cron这个守护进程来处理 ps -ef | grep cron
cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“cron table”的简写。
1、 cron在3个地方查找配置文件(设置shell脚本):
一、/var/spool/cron/yanggang 这个目录下存放的是每一个用户(包括root)的crontab任务,每一个任务以建立者的名字命名,好比用户tom建的crontab任务对应的文件就是/var/spool/cron/tom
yanggang@barry$ sudo ls -l /var/spool/cron/(或有时是 /var/spool/cron/crontabs/)
-rw------- 1 root crontab 1071 2011-09-19 17:20 root
-rw------- 1 yanggang crontab 1176 2011-09-24 11:07 yanggang
通常一个用户最多只有一个crontab文件(如:root, yanggang等),其对应日志在/var/spool/mail/root(或/var/spool/mail/yanggang)文件里
二、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其余任务的crontab。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .---------------- 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
# | | | | |
# * * * * * command to be executed
例如:
*/5 * * * * root /usr/libexec/atrun
minute:表明一小时内的第几分,范围 0-59。
hour:表明一天中的第几小时,范围 0-23。
mday:表明一个月中的第几天,范围 1-31。
month:表明一年中第几个月,范围 1-12。
wday:表明星期几,范围 0-7 (0及7都是星期天)。
who:要使用什么身份执行该指令,当您使用 crontab -e 时,没必要加此字段。
command:所要执行的指令。
三、/etc/cron.d/ 这个目录用来存听任何要执行的crontab文件或脚本。
2、 权限crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在用法以下: 一、若是两个文件都不存在,则只有root用户才能使用crontab命令。 二、若是cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,若是root用户也不在里面,则root用户也不能使用crontab。 三、若是cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 四、若是两个文件都存在,则列在cron.allow文件中并且没有列在cron.deny中的用户可使用crontab,若是两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,若是cron.allow中有该用户,则可使用crontab命令。 AIX 中 普通用户默认都有 crontab 权限,若是要限制用户使用 crontab ,就须要编辑/var/adm/cron/cron.deny HP-UNIX 中默认普通用户没得crontab 权限 ,要想放开普通用户的crontab 权限能够编