linux定时任务设置

小TOT 创建于 2017-02-15

linux下的定时任务软件

  • at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。
  • crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现。
  • anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未执行的任务,下次开机时可以补上执行。其中crontab为最常用的定时任务人家。

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

安装crontab

crontab不是linux系统自带的软件,因此需要安装。centos使用如下命令安装

[root@CentOS ~]# yum install vixie-cron
[root@CentOS ~]# yum install crontabs

vixie-cron软件包是cron的主程序;crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。

cron如何工作

运行linux后,开机自启动crond任务,系统会每分钟检查是否有要执行的任务工作(循环检测)默认系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过/etc/cron.allow文件限制权限。

配置文件介绍

使用yum命令安装的cron的配置文件放在/etc下面。配置文件已cron开头。 运行 ls /etc/ |grep cron得到如下结果

    anacrontab #系统级别的计划任务及其扩展
    cron.d #crond的配置目录
    cron.daily    # 一个目录,用于存放每天执行一次的文件
    cron.deny     # cron权限管理文件,写入改文件的用户不能使用cron
    cron.hourly   # 同cron.daily
    cron.monthly  # 同cron.daily
    crontab       # cron的配置文件,主要定义用户的一些计划
    cron.weekly   # 同cron.daily

系统级别的计划任务及其扩展anacrontab anacrontab就是系统计划任务的扩展文件:在一个指定时间间隔错过后自动执行任务 这个是系统设置好了,清理系统垃圾或者是自动执行某些脚本的系统任务,一般我们做了解就行了,不要更改 配置文件是/etc/anaconrtab 详情见

crond使用

crond命令如下:

##设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 
crontab -u 
##列出某个用户cron服务的详细内容 
crontab -l 
##删除某个用户的cron服务 
crontab -r 
##编辑某个用户的cron服务  
crontab -e

编辑定时任务

cron支持两种模式

  1. 直接编写计划任务;
  2. 使用目录的方式,放在目录里面的都会定时执行,需要使用run-parts参数

配置定时任务有两种方式

1,使用crontab -e对其内容进行编辑。使用crontab -e编辑,时会打开一个临时文件,编辑完成之后保存到/var/spool/cron/目录下。 2,直接编辑/etc/crontab文件。

定时任务语法规则

查看/etc/crontab文件

    # 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

定时任务命令由 执行频度+执行用户+执行命令构成

  • 执行频度一些关键字

“*”代表取值范围内的数字, “-”代表从某个数字到某个数字, “,”分开几个离散的数字

  • 示例
      43 21 * * *             #21:43 执行
      15 05 * * *           #05:15 执行
      0 17 * * *              #17:00 执行
      0 17 * * 1              #每周一的 17:00 执行
      0,10 17 * * 0,2,3       #每周日,周二,周三的 17:00和 17:10 执行
      0-10 17 1 * *           #毎月1日从 17:00到7:10 毎隔1分钟 执行
      0 0 1,15 * 1            #毎月1日和 15日和 一日的 0:00 执行
      42 4 1 * *            #毎月1日的 4:42分 执行
      0 21 * * 1-6          #周一到周六 21:00 执行
      */10 * * * *       #每隔10分 执行
    
  • run-parts示例 执行文件夹文件的配置与执行某个命令配置基本类似,只是将执行命令改成run-parts 目录
    ##每小时执行/etc/cron.hourly内的脚本 
    01 * * * * root run-parts /etc/cron.hourly 
    ##每天执行/etc/cron.daily内的脚本
    02 4 * * * root run-parts /etc/cron.daily 
    ##每星期执行/etc/cron.weekly内的脚本 
    22 4 * * 0 root run-parts /etc/cron.weekly 
    ##每月去执行/etc/cron.monthly内的脚本 
    42 4 1 * * root run-parts /etc/cron.monthly
    

启动crond

使用yum命令安装的crond已经将crond注册为service。因此操作非常方便 编辑完成后使用service crond reload即可完成重启

注意事项

  1. 每个任务添加注释,谁写的,什么时间写的,完成什么需求?
  2. 执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)
  3. 尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。
  4. 定时任务中带%无法执行,需要加\转义
  5. 如果时上有值,分钟上必须有值
  6. 日和周不要同时使用,会冲突
  7. >>>/dev/null 2>&1不要同时存在