每天学一个 Linux 命令(98):crontab

Posted 民工哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天学一个 Linux 命令(98):crontab相关的知识,希望对你有一定的参考价值。

命令简介

在服务器安装好系统及相关服务之后,对于系统的配置、服务的配置、数据的管理以及服务器的操作权限管理就变的尤为重要。因为,涉及到服务器的各项安全(如:登录、操作)。

crontab 命令用来打开 cron 表进行编辑。

定时任务:顾名思义,就是定期执行某项操作或者某种行为。像Windows系统同样它也有定时任务服务。

在Linux系统中,crond是Linux系统中用来定期执行命令、脚本或指定程序的一种服务。定时任务一般有以下两种用途:

  • 1、系统自身定期执行的操作或任务(如:日志轮询)。
  • 2、用户定期执行的操作或任务(如:定时更新同步数据、重要数据备份等)。

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

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

/etc/crontab 文件内容如下

[root@centos7 ~]# cat /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

从上机的配置文件,可以看出系统定时任务格式/etc/crontab分为6段,以空格分隔。前5段为时间格式,第6段是所需执行的命令。详细的说明:

minute  #分钟,可以是从0到59之间的任何整数
hour   #小时,可以是从0到23之间的任何整数
day    #日期,可以是从1到31之间的任何整数
month  #月份,可以是从1到12之间的任何整数
week   #星期,可以是从0到7之间的任何整数,这里的0或7代表星期日
command  #执行的命令,可以是系统命令,也可以是自己编写的脚本文件

在上述的配置字段中,还会使用到下面的特殊字符

*(星号)  #表示所有值。比如在第一段中如果使用*,则表示在满足其他条件的同时每分钟都执行后面的命令操作。
,(逗号)  #用逗号分隔的值表示指定的一个范围。比如在第四段使用1,3,5,7,则表示在第1,3,5,7月的含义。
—(中杠)  #表示一个范围。比如在第二段使用0-8,则表示0点到8点这一区间范围。
/(正斜线)  #表示一个时间的间隔频率。比如在第一段使用*/5,则表示每间隔5分钟的含义。

语法格式

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

选项说明

-e  #编辑该用户的计时器
-l  #列出该用户的计时器
-r  #删除该用户的计时器
-u<用户名称>  #指定要设定计时器的用户名称

定时任务书写与配置

书写定任务规范

在日常实际生产、测试环境中,书写定时任务是需要遵守一定的规范、规则的。笔者根据自己实际生产环境书写经验,总结如下:

  • 1、书写定时任务时必须对每一行或一段加上注释信息。
  • 2、如里是以shell脚本执行的任务,在最前面加上解释/bin/sh。
  • 3、对于执行脚本的定时任务,需在其结尾加上>/dev/null 2>&1将一些不必要的输出信息重定向到空,也就是不输出不需要的信息。
  • 4、使用系统或服务命令要使用绝对路径,再写到脚本,最后将脚本写进定时任务中。
  • 5、规范使用目录(如定时任务执行的脚本目录设置成/server/cron_scripts)。
2)定时任务配置

实际生产、测试环境,对于定时任务的配置也是需要有一定操作规范的,具体如下:

  • 1、对于执行命令的形式的定时任务,需要先测试命令执行情况,确认无误后将执行的命令写进脚本。
  • 2、对于脚本形式的定时任务,首先就是需要调试脚本的整体执行情况,然后使用规范目录路径写进定时任务。
  • 3、对于生产环境的定时任务操作,必须在测试环境进行反复测试,确认无误后再应用到实际生产环境中,然后在定时任务执行后人工进行检查执行情况。

对于定时任务的具体实例及各类操作,可参考官方文档说明。读者也可在自己的实验环境进行书写、配置,本章节就不做过多赘述。

以上的内容源自民工哥的新书《 Linux 系统运维指南 从入门到企业实战 》

应用举例

查看当前登录用户下的定时任务情况

[root@centos7 ~]# crontab -l
no crontab for root

每小时的第5和第15分钟执行

5,15 * * * * command_name

在上午9点到11点的第5和第15分钟执行

5,15 9-11 * * * command_name

每隔3天的上午9点到11点的第5和第15分钟执行

5,15 9-11 */3 * * command_name

每个星期一的上午9点到11点的第5和第15分钟执行

5,15 9-11 * * 1 command_name

每月1、11、21日的14:45重启httpd

45 14 1,11,21 * * /etc/init.d/httpd restart

每周六、周日的1:10重启smb

10 1 * * 6,0 /etc/init.d/httpd restart

每小时执行/etc/scripts/test.sh这个脚本

01 * * * * /etc/scripts/test.sh

每天学一个 Linux 命令(96):ntpdate

每天学一个 Linux 命令(97):jobs

以上是关于每天学一个 Linux 命令(98):crontab的主要内容,如果未能解决你的问题,请参考以下文章

每天学一个 Linux 命令(67):nmap

每天学一个 Linux 命令(46):du

每天学一个 Linux 命令(41):zip

每天学一个 Linux 命令(40):gzip

每天学一个 Linux 命令(15):man

每天学一个 Linux 命令(102):tac