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

利用shell脚本实现计划任务功能 V1.2的更多相关文章

  1. 利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出 ...

  2. 利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下

    背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/data/images/).后来访问量大了,图片也多了,这样就影响读取效率.所以有个这样的需求,把这些个图片文件移 ...

  3. 利用shell脚本去备份幸运28源码搭建下载所指定的数据库

    #! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...

  4. 利用shell脚本个性化运行jar任务

    利用shell脚本可以个性化运行jar任务,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/jars/data_migration_from_sqlse ...

  5. shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中

    shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...

  6. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  7. 利用shell脚本统计文件中出现次数最多的IP

    比如有如下文件test.txt 1  134.102.173.43 2  134.102.173.43 3  134.102.171.42 4  134.102.170.9 要统计出现次数最多的IP可 ...

  8. 利用shell脚本生成CHANGELOG.md(包含git提交规范)

    前言 我们经常看到github上面有很多CHANGELOG.MD包含版本的更新信息,如果我们的git提交能遵循一定的规范,那么使用gitlog就能很方便的生成它 生成结果  shell脚本 http ...

  9. 利用shell脚本自动获取awr报表

    观察Oracle数据库性能,oracle自带的awr功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.通过报告可以了解一个系统的整个运行情况,生成的报告包括多个 ...

随机推荐

  1. nopCommerce 3.9 接口笔记

    接口笔记 Nop.Services.Configuration ISettingService : 配置接口(查看) Nop.Services.Localization ILocalizationSe ...

  2. Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画

    原文:Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画 首先,来看下实现后的效果: 关于VisulaState VisualState 指定控件处于特定状态时的外观.例 ...

  3. Fastjson 序列化,反序列化Map对象排序问题(字符串转map,map转字符串)

    背景 记录项目中遇到的 关于fastjson jsonobject转string乱序,string转jsonObject乱序问题的解决方案 fastJson issues 问题来源描述参见: http ...

  4. 【bzoj2002】弹飞绵羊(分块)

    题目分析 题意:每个点都有一个值$v_i$,从一个点出发,每走到一个点,会跳到i+vi的位置,问需要跳多少次能跳出n?带修改. 此题可以用lct做,此处使用了分块:将序列分块后,每个点记录从此点最少跳 ...

  5. 两分钟读懂ThreadLocal

    ThreadLocal的工作原理 场景 假设一个用户是一个线程.他们都对数据库进行操作,这个时候就会每个用户就会从数据源中开启一个事务以确保能够顺利的打开或者关闭事务.那么如何保证用户与用户之间的数据 ...

  6. TensorFlow 下 mnist 数据集的操作及可视化

    from tensorflow.examples.tutorials.mnist import input_data 首先需要连网下载数据集: mnsit = input_data.read_data ...

  7. 修改MessageBox的标题的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1.用Win API的::MessageBox或CWnd::MessageBox代替AfxMessageBox. 2. ...

  8. OpenCV绘制朱利亚(Julia)集合图形

    朱利亚集合是一个在复平面上形成分形的点的集合.以法国数学家加斯顿·朱利亚(Gaston Julia)的名字命名. 朱利亚集合可以由下式进行反复迭代得到: 对于固定的复数c,取某一z值(如z = z0) ...

  9. c语言学习笔记(13)——链表

    链表 算法: 1.通俗定义: 解题的方法和步骤 2.狭义定义: 对存储数据的操作 3.广义定义: 广义的算法也叫泛型 无论数据是如何存储的,对数据的操作都是一样的 我们至少可以通过两种结构来存储数据 ...

  10. Python算法(含源代码下载)

    关键字:Python Algorithms Python算法  Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...