【惊雷】linux下的Crontab命令详细实用(归纳)

一、前言

Crontab命令在linux下被用作管理、提交用户的周期性执行的计划任务,跟windows下的at计划任务类似。该功能在linux系统安装完成
后,默认就会安装了此服务,并且自动启动crond进程,保存即可生效。crond会根据用户的需求周期性而定期的检查是否有要执行的任务。
达到条件就会自动执行该任务。

 

二、两种任务调度类型

1、系统任务调度:系统周期性所要执行的计划工作,如日志清理,缓存数据到硬盘等等。在/etc目录下面的一个crontab文件,就是系统任务调度的

配置文件。

2、用户任务调度:用户周期性或者定期的计划执行的工作,如用户数据备份、定时邮件提醒等等,用户则使用crontab工具定制自己的

计划任务。所有用户定义的crontab文件都会被保存在/var/spool/cron的目录下面。其文件名与用户名一致。在etc目录下面有使用者权限文件:

1)/etc/cron.deny 该文件中所列用户不允许使用crontab命令
2)/etc/cron.allow 该文件中所列用户允许使用crontab命令
3)/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名

(以上就是linux下crontab的一点讲解和认识,还有很多,长篇大论,如果不是深入了解的大致知道是这么个过程就好。下面我都是最直观的写出了自己对这个
任务调度的用法,我很不喜欢这种长篇大论,不实用的说辞。总之一句话改过系统调度的就用etc下面那个,自个人玩的直接crontab -e 自己弄一个
想不生效了,直接注释掉就行了。网上有很多关于这方面的博文,但是一千个人就有一千个哈姆雷特,我就喜欢这么简洁的表达方式,这就是我为什么要写一遍这样的博文的根本原来,希望更多新手看到,能够快速的理解和实用起来,等到你真有探讨的兴趣了可以去细看)

以上就是笼统的归纳了一些crontab的知识,知道上面这些便可。

三、下面对crontab的实际操作模型进行一个简要而实用的解析 

下面我们就以/etc/crontab下面的调度表来说明

 

                                                                                                                     (图1-1)

 

为了更加清晰的说明,我就把上面的图1-1中红框的部分截取了出来,如下图1-2

 

                                                            (图1-2)

(由于在此文本模版不便于编辑这些符号,所以就把自己打草稿的截图过来了)

T1 T2 T3 T4 T5 Program  (必须记得这个结构,万变不离其中)
其中 T1 是表示分钟,T2 表示小时,T3 表示一个月份中的第几日,T4 表示月份,T5 表示一个星期中的第几天。Program 表示要执行的程式(命令)。

好,下面开始代入我的方法一起去看看下面的例子:

时程计划表的格式:
(一)、格式:T1  *  *  *  * Program
5  *  *  *  *  命令 代表在分钟的计划表内每5分钟执行一次命令
*  5  *  *  *  命令 代表在小时的计划表内每5小时执行一次命令

 

(二)、格式:*/n * * * * Program
*/5    *     *   *   *  命令 分钟的计划表内(除以5),每5分钟执行一次命令
 *     */5   *   *   *  命令 小时计划表内,没5小时执行一次命令

(三)、格式:a,b,c,d,... * * * * Program
5,15,25,35,45,55 * * * * 命令 代表分钟的计划表内 每到第5分钟、第15分钟、第25分钟....就开始执行一次命令
* * 2,12,22 * * 命令 代表月份的几号的计划表内,每到那到一个月的2号、一个的12号、一个月的22号就开始执行一次命令

 

 

(四)、格式:T1 T2 * * * Program
0 0 * * * 命令 代表那一天内,的晚上0点0分开始执行一次命令
5 0 * * * 命令 代表那一天内的晚上0点05分开始执行一次命令

 

 

(五)、格式:T1-T1+n * * * * Program
5-10 * * * * 命令 代表分钟的计划表内第5分钟到第十分钟都要执行这个命令
* 6-7 * * * 命令 代表小时的计划表内第6个小时到第7个小时都要执行这个命令

 

注意:

1、由于unix版本的差异,在hp unix aix 使用这个*/n会报错。还有注意上面五个星号,五个时间计划表的活用。

2、5个星号 “*”  、符号“-”代表时间的持续一直到  、  符号“,”  代表时间的间隔,不能用空格 (指的不是T1跟T2之间不能用空格,而是T1这个时间设计点里面不能出现空格)

3、在星号跟星号之间使用空格隔开代表一下个计划表,但是下面的例子中数字与数字也隔开了好几个呢?这仅仅代表一个计划表。一切以星号的隔开为例。只有星号的隔开才能代表一个计划表以及另一个计划表。

 

四、直观的使用办法
1、直接打开/etc/crontab 这个文件添加保存生效即可使用

2、直接命令进去crontab进程编辑时间程式(推荐这种最直观最便捷)
crontab -e 编辑
crontab -l 查看
crontab -r 删除(很少用到,服务器稳定一般情况不用的时候直接注释就好了,用不着删除)

 

(关于程式命令执行之后得出的信息以及反馈的处理(cron的输出配置)这个其实大致可以去参考标准输入、输出以及标准错误的使用办法,其中计划表执行的最后的信息到底

留不留、怎么留法就用到这种参数。希望能够更加细入的去管理你这些计划程式的话可以去深入了解一下,下面举个例子:

下面笼统的说一下用法:

当你希望你的程式命令按照计划执行之后得出的反馈信息,你不想收到。则请在每一行空一格之后加上 > /dev/null 2>&1
使用方式:*/5 * * * * /usr/local/php/bin/php -f /scrips/csmj_igetui/igetui.php > /dev/null 2>&1

如果你想收到这样的信息(作为程序员这些信息很重要,用来判断脚本程式等问题)就在每一行空一格加上 2>&1即可,同时在前面加上一个导入的文件。你这些信息该放到哪里 。
正确的方式是这样的:0 * * * * /var/sshl/jhjk.sh >> /root/chenghao/kjl.log 2>&1

至于这个标准输入、输出以及标准错误的,可以参考下面几个网址。
参考:
http://www.cnblogs.com/softidea/p/3965093.html

https://blog.csdn.net/hnmsky/article/details/7035814

这个后期我会补上自己关于这个最直观的使用方法上面两篇的博主写的都很好,就是不够直观。

五、上机提议

最后在网上选取大部分例子的集合在大家看完之后可以细看并好好的领会这些用法:

1、每天早上6点,执行命令。并把结果输出到文件test.txt中去。
0 6 * * * echo "Good morning." >> /tmp/test.txt #注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

2、在9月份的每周一,三,五的15点(即下午3点)执行该脚本,且不返回任何信息。
00 15 * 9 1,3,5 sh /scrips/csmj.sh >/dev/null


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

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

5、每月的4号与每周一到周三的早上11点重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 或者写成0 11 4 * 1-3 /usr/local/etc/rc.d/lighttpd restart

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

7、每日的0点重启apapche
0 * * * * /usr/local/etc/rc.d/lighttpd restart

8、每天早上6点10分
10 6 * * * date

9、每两个小时
0 */2 * * * date

10、晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date

11、每个月的4号和每个礼拜一到礼拜三的早上11点
0 11 4 * 1-3 date

12、1月1日早上4点
0 4 1 1 * date

13、每天的18点到23点之间,每隔30分钟重启apache
*/30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

 

6、总结深入使用需要注意的几个问题

1、系统级任务调度与用户级任务调度
系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

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

3、当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

4、千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了,最好使用注释的方法。

5、在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。
6、每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

7、有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。
要么你就在crontab里面加,要么你就在脚本里面加环境变量。

 

【上述有错误的地方,希望各位给予指出,感谢】

 

posted @ 2018-06-13 18:49  SeagullUp  阅读(669)  评论(0编辑  收藏  举报