linux定时执行脚本|linux定时执行任务crontab命令使用详解

更新时间:2019-11-11    来源:linux    手机版     字体:

【www.bbyears.com--linux】

在vps中很常见的一个用法就是定时执行任务,定时执行任务可以减少人为工作量,提高效率。linux系统的定时任务是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划任务,所以,Linux系统也提供了使用者控制计划任务的命令:crontab 命令。

linux定时执行任务简介

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。linux下的定时任务的执行都依赖于该守护进程。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。


1)系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。通过编辑该文件,我们可以设置定时执行任务。

2)用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab命令来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中,其文件名与用户名一致。

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρόνος),原意是时间。

通常,crontab储存的指令被守护进程激活,crond进程在后台常驻运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

crontab命令的基本用法

1、crontab命令选项

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置: crontab -u root -l

再例如,root想删除fred的cron设置: crontab -u fred -r

2、crontab命令特殊符号

“*” 代表所有的取值范围内的数字。这个需要特别注意
“/” 代表每的意思,如*/10,如果用在minute字段,表示每十分钟执行一次。
“-” 代表从某个数字到某个数字,如“2-6”表示“2,3,4,5,6”
“,” 指定一个列表范围,例如,“1,2,5,7,8,9”
3、crontab命令定时任务文件格式

crontab调度任务的文件格式一般如下所示:

Minute   Hour   Day   Month    Dayofweek     command

分钟     小时    天     月       天每星期       命令
 
每个字段代表的含义如下:
Minute        每个小时的第几分钟执行该任务
Hour          每天的第几个小时执行该任务
Day           每月的第几天执行该任务
Month         每年的第几个月执行该任务
DayOfWeek     每周的第几天执行该任务
Command       指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache


注:run-parts参数表示,执行后面目录中的所有可执行文件。root表示以root身份来执行目录下可执行文件。

添加定时执行任务

如第一节所述,新增调度任务可用两种方法:
1)在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。添加任务命令的格式在上一节中有详细的介绍。该命令编辑的是/var/spool/cron下对应用户的cron文件,属于用户任务调度。

2)直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务,属于系统任务调度。
crond进程每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也可以定时执行任务。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin  //环境变量
MAILTO=root      //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/           //使用者运行的路径,这里是根目录
# run-parts
01   *   *   *   *     root run-parts /etc/cron.hourly          //每小时执行
/etc/cron.hourly内的脚本
02   4   *   *   *     root run-parts /etc/cron.daily           //每天执行/etc/cron.daily内的脚本
22   4   *   *   0     root run-parts /etc/cron.weekly          //每星期执行 /etc/cron.weekly内的脚本
42   4   1   *   *     root run-parts /etc/cron.monthly         //每月去执行/etc/cron.monthly内的脚本
0    *   *   *   *     root /root/vncrestart_tennfy.sh          //每小时执行vncrestart_tennfy.sh文件

在最后一行为我们自行添加的定时任务,即每小时执行vncrestart_tennfy.sh文件,其中vncrestart_tennfy.sh必须为可执行文件。

注意事项

crontab使用过程中有一些值得注意的地方,下面做一个简单的介绍。

1、清理用户邮件

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

2、cron job的执行时间问题

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

小结

这篇文章介绍了linux定时执行任务的常见用法,包括两种方式:

1)系统任务调度,即通过编辑/etc/crontab进行添加定时任务;

2)用户任务调度,即通过crontab -e命令添加定时任务。在shell脚本的编写中,我们常用第一种方法进行定时任务的添加。

本文来源:http://www.bbyears.com/caozuoxitong/78540.html