• 利用shell脚本实现计划任务功能 V1.2


    2013.05.10  mytask 1.2

      主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号。

    2013.05.07 mytask 1.1

      昨天发布了mytask1.0 版后(利用shell脚本实现计划任务功能),一直在想着如何解决那个最后的遗留问题"每个任务脚本中声明的函数名必须唯一不能重复,否则会导致任务函数覆盖。",无意间自问了一句为什么不能像crontab那样直接调用脚本和命令呢?这一问才让自己回忆起来,之所以用function封装任务是因为早期的版本是把任务和主程序写在一个脚本里的,后来多次修改后将任务从主程序里分离了出来,但写到function中的设计一直没有变,不合理的设计也就不知不觉变得合理了.

      问题想清楚后开始重新调整程序, 首先将所有的任务代码直接写到每个脚本中,取消函数包装.然后把任务初始化声明剥离出来形成单独的任务配置文件,这样程序间的耦合度下降,结构也清楚多了.最后还加入了动态重载任务配置文件的功能,使mytask程序使用起来更方便.

    一、mytask 实现功能:

    1、多任务并发执行,不会互相影响,采用锁机制避免单个任务的重叠执行。

    2、每个任务以单独脚本形式保存,相互独立。

    3、支持起始运行时间,如"2013/05/08"、"13:30"或“now”。并且支持给起始运行时间的修正值,比如"now+5m"表示当前时间的5分钟后执行(另外还实现了负数修正值,比如-1h,现在觉得这个功能挺无聊的)。

    4、支持多种类型的运行周期设定,包括秒、分、时、天、周、月、年还有一次性任务。

    5、会根据任务执行间隔,自动设定休眠时间,主程序占用资源极小。

    6、任务可以是SHELL脚本,也可以是直接的linux命令。

    7、独立的任务配置文件,集中定义任务内容、起始时间和运行间隔。(个人感觉比crontab的设定更直观)

    8、支持运行时重载任务配置文件,无需重启主程序就可以将调整后的任务加入计划。

    二、任务配置文件说明:

    默认的任务配置文件为主程序目录下的mytask.conf

    每一行配置对应一个计划任务,配置项之间以逗号分隔,任务配置定义如下:
    <任务内容>,<起始运行时间>,<运行周期>

    1、任务内容,可以是脚本文件、命令等。
    要注意写全文件或命令的路径,可以使用全局变量$BASEDIR代表主程序所在目录。
    复杂的命令建议保存在脚本文件中。

    2、起始运行时间分两部分。
    第一部分为初始时间,格式为"yyyy/MM/dd hh:mm:ss"也可以是时间值片断,例如:"2013/03/05"、"03/05"、“03/05 21:30”、"21:30"或当前时间"now"。
    第二部分为修正时间,格式为"+时间单位"或“-时间单位”,意思为在初始时间的基础上做进一步的时间修正。
    例如:"+5s"、"-10m"等。
    时间的单位区别大小写,具体定义如下:
    y=年、M=月、d=日、h=时、m=分、s=秒、w=星期

    3、运行周期即为任务函数运行的间隔时间,取值与修正时间类似,只是取消了+-号,如果值为不带单位的0则表示只运行一次。

    任务定义示例如下:
    #在凌晨零点开始执行,每隔1天运行一次。
    $BASEDIR/tasks/backdb.sh,00:00,1d

    #在当前时间的2分钟后开始执行,每隔1个月运行一次。
    $BASEDIR/tasks/test1.sh,now+2m,1M

    #在5月12日14点30开始执行,每隔1小时运行一次。
    /home/lykyl/sp.sh,5/12 14:30,1h

    #在15:50点开始执行,每隔30秒运行一次。
    $BASEDIR/tasks/test3.sh,15:50,30s

    #启动即开始执行,每隔1分钟运行一次。
    touch /tmp/ohyeah,now,1m

    #在当前时间的1小时后开始执行,只运行一次。
    $BASEDIR/tasks/test5.sh,now+1h,0

    三、程序控制命令

    1、启动

     nohup ./mytask.sh &

    2、退出

    kill -15 `cat ./mytask.pid`

    3、运行时重新加载任务配置文件

    kill -SIGUSR1 `cat ./mytask.pid`

    四、题外话

    程序运行原理和1.0版基本一致,另外源码中也加入了必要的注解,因此也就没必要在这儿重复列表。有兴趣的可以点击浏览前文《利用shell脚本实现计划任务功能》,包括开发背景、思路和主要代码。

    这个程序是因为工作需要而编写的,目前已经在工作环境稳定运行,代码本身并不复杂,SHELL刚刚入门的朋友完全可以当做练手自己试着边运行程序边理解代码。语法上的问题,可以参考我的另一篇博文《linux bash script简明手册》。

    mytask1.2完整源码点此下载

    lykyl原创,转载请注明出处)
     
    http://www.cnblogs.com/lykyl/archive/2013/05/07/3065913.html
  • 相关阅读:
    HttpServlet RequestDispatcher sendredirect和forward
    java中判断字符串是否为数字的方法的几种方法
    apk 解包 打包
    js cookie
    js中的this关键字
    Myeclipse 添加Android开发工具
    List<T> List<?> 区别用法
    mysql 命令
    BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
    【学习笔记】求矩阵的特征多项式
  • 原文地址:https://www.cnblogs.com/findumars/p/6827849.html
Copyright © 2020-2023  润新知