zoukankan      html  css  js  c++  java
  • CentOS7计划任务crontab

    一、计划任务的基本概念

    linux系统采用crond守护进程来控制系统和用户的计划任务,实现周期性的执行某种任务或处理某些事件。

    Linux系统本身就有很多的计划任务,所以crond服务是默认安装和启动的。crond服务每分钟都会检查是否有需要执行的任务,如果有则自动执行该任务。执行以下命令可以看到crond服务的运行情况:

    systemctl status crond
    

    在这里插入图片描述

    Linux下的计划任务分为两种:用户计划任务和系统计划任务。

    二、用户计划任务

    Linux的每个用户可以定义自己的计划任务,周期性的执行脚本或程序。计划任务的内容存放在crontab文件中,每个用户都有自己的crontab文件。

    1、查看crontab文件

    crontab -l [-u 用户名]
    

    root用户可以用-u参数查看指定用户的计划任务,如果没有-u参数,表示查看自己的计划任务。普通用户只查看自己的计划任务,不允许使用-u参数。

    2、编辑crontab文件

    crontab -e [-u 用户名]
    

    root用户可以用-u参数编辑指定用户的计划任务,如果没有-u参数,表示编辑自己的计划任务。普通用户只能编辑自己的计划任务,不允许使用-u参数。crontab缺省的编辑工具是vi。

    3、删除crontab文件

    crontab -r [-u 用户名]
    

    root用户可以用-u参数删除指定用户的计划任务,如果没有-u参数,表示删除自己的计划任务。普通用户只删除自己的计划任务,不允许使用-u参数。

    4、crontab文件格式

    在这里插入图片描述
    crontab文件中的每个任务由两部分组成,执行时间和执行命令。

    1)执行时间,有5个参数:

    第1部分:分钟(minute),取值0-59。

    第2部分:小时(hour),取值0-23。

    第3部分:月当中的天(day of month),取值1-31,。

    第4部分:月份(month),取值1-12,或采用月份单词的英文简写。

    第5部分:星期中的天(day of week),取值0-6,或采用星期单词的英文简写。

    在以上各部分中,还可以使用以下特殊字符:

    星号(*):代表全部的值,例如day of month字段如果是星号,则表示在满足其它字段的制约条件后每天执行该任务。

    逗号(,):可以用逗号分隔开的值指定一个列表,例如,“1,2,5,7,8,9”。

    中杠(-):可以中杠表示一个范围,例如“2-6”表示“2,3,4,5,6”。

    正斜线(/):可以用正斜线指定时间的间隔频率,例如minute字段,“0-30/5”表示在0-30的范围内每5分钟执行一次;“*/5”表示每十分钟执行一次。

    2)执行命令:任务执行的程序,可以是shell脚本,也可以是其它的可执行文件,但是要注意几个问题:

    a)crontab中执行程序的时候,不会先执行系统和用户的环境变量文件,如果待执行的程序需要环境变量,程序将无法执行;

    b)crontab中执行的程序必须采用全路径。

    5、crontab示例

    1)每两分钟执行一次date命令,结果输出到/tmp/date.log文件(下同)。

    */2 * * * * /usr/bin/date > /tmp/date.log
    

    2)在每个小时的05、10、15分执行一次date命令。

    5,10,15 * * * * /usr/bin/date > /tmp/date.log
    

    3)在每个小时20-30分之间的每一分钟执行一次date命令。

    20-30 * * * * /usr/bin/date > /tmp/date.log
    

    4)在每天的10:30分执行一次date命令。

    30 10 * * * /usr/bin/date > /tmp/date.log
    

    5)在每个月1号的02:30分执行一次date命令。

    30 02 1 * * /usr/bin/date > /tmp/date.log
    

    6)在每星期天的02:30分执行一次date命令。

    30 02 * * 0 /usr/bin/date > /tmp/date.log
    

    三、系统计划任务

    网上很多文章认为系统计划任务是执行系统级别的周期性任务,例如系统备份、把缓存数据写入硬盘、清理日志文件等。这些说法有些片面,我不这么认为,我先介绍系统计划任务的相关知识,然后通过示例来演示。

    系统计划任务在/etc/crontab文件配置,以下缺省/etc/crontab文件的内容:
    在这里插入图片描述
    系统计划任务的/etc/crontab文件中,可以设置环境变量,可以指定执行任务的用户。系统计划任务的执行时间的与用户计划任务的执行时间含义相同,不再描述。

    示例:

    Oracle数据库提供了sqlplus工具,执行sqlplus需要环境变量,如ORACLE_HOME、ORACLE_BASE等,如果采用系统计划任务执行一个SQL脚本,步骤如下:

    1)准备/tmp/test.sql脚本文件,内容如下:

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    
    exit;
    

    2)在/etc/crontab文件中增加环境变量和任务,如下:

    # 设置Oracle的环境变量。
    ORACLE_BASE=/oracle/base
    ORACLE_HOME=/oracle/home
    ORACLE_SID=snorcl11g
    NLS_LANG='Simplified Chinese_China.ZHS16GBK'
    LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
    
    # 每分钟调用sqlplus执行/tmp/test.sql脚本,结果输出到/tmp/test.log文件。
    */1 * * * * oracle /oracle/home/bin/sqlplus scott/tiger @/tmp/test.sql >/tmp/test.log
    

    3)每隔一分钟查看/tmp/test.log文件的内容,如下:
    在这里插入图片描述

    四、如何在用户计划任务中执行需要环境变量的程序

    用户的计划任务无法设置环境变量,那么如何在用户计划任务中执行需要环境变量的程序呢?我们可以这么做:

    1)编写一个shell脚本;

    2)在脚本中设置环境变量;

    3)在脚本中执行需要环境变量的程序。

    示例:

    1)编写/tmp/test.sh脚本文件,内容如下:

    # 设置系统环境变量。
    source /etc/profile
    # 设置oracle用户的环境变量。
    source /oracle/.bash_profile
    # 执行/tmp/test.sql脚本。
    /oracle/home/bin/sqlplus scott/tiger @/tmp/test.sql > /tmp/test1.log
    

    2)准备/tmp/test.sql脚本文件,内容如下:

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    exit;
    

    3)设置oracle用户的计划任务文件,内容如下:

    # 每分钟执行一次/tmp/test.sh脚本。
    */1 * * * * /bin/sh /tmp/test.sh
    

    4)每隔一分钟查看/tmp/test1.log文件的内容,如下:
    在这里插入图片描述

    五、应用经验

    用户计划任务和系统计划任务没有本质的区别,都可以达到相同的目的。

    在实际项目中我偏向用户的计划任务,虽然用户计划任务的crontab文件中不能设置环境变量,但可以通过脚本文件来解决,并且,脚本文件中编写指令比crontab文件更灵活。

    六、版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net

    作者:码农有道

    如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

  • 相关阅读:
    聊聊和关系型数据库相关的一些概念
    Spring-MongoDB 关键类的源码分析
    Studio 3T 如何使用 Query Builder 查询数据
    MySQL error : Deadlock found when trying to get lock; try restarting transaction
    The java.util.concurrent Synchronizer Framework笔记
    JDK 8
    MongoDB Data Model 浅谈
    Java 泛型分析
    DCL(双检锁)的失效:现实与初衷的背离
    vue之虚拟dom
  • 原文地址:https://www.cnblogs.com/wucongzhou/p/12579311.html
Copyright © 2011-2022 走看看