Python实现的循环定时服务功能。类似于Linux下的contrab功能。主要通过定时器实现。

注:Python中的threading.timer是基于线程实现的。每次定时事件产生时。回调完响应函数后线程就结束。而Python中的线程是不能restart的,所以这样的循环定时功能必需要在每次定时响应完毕后再又一次启动还有一个定时事件。

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4.  
  5. import subprocess
  6. from threading import Timer
  7. import time
  8. import os
  9. import sys
  10.  
  11. if os.name == 'posix':
  12. def become_daemon(our_home_dir='.', out_log='/dev/null',
  13. err_log='/dev/null', umask=0o022):
  14. "Robustly turn into a UNIX daemon, running in our_home_dir."
  15. # First fork
  16. try:
  17. if os.fork() > 0:
  18. sys.exit(0) # kill off parent
  19. except OSError as e:
  20. sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
  21. sys.exit(1)
  22. os.setsid()
  23. os.chdir(our_home_dir)
  24. os.umask(umask)
  25.  
  26. # Second fork
  27. try:
  28. if os.fork() > 0:
  29. os._exit(0)
  30. except OSError as e:
  31. sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
  32. os._exit(1)
  33.  
  34. si = open('/dev/null', 'r')
  35. so = open(out_log, 'a+', 0)
  36. se = open(err_log, 'a+', 0)
  37. os.dup2(si.fileno(), sys.stdin.fileno())
  38. os.dup2(so.fileno(), sys.stdout.fileno())
  39. os.dup2(se.fileno(), sys.stderr.fileno())
  40. # Set custom file descriptors so that they get proper buffering.
  41. sys.stdout, sys.stderr = so, se
  42. else:
  43. def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=0o022):
  44. """
  45. If we're not running under a POSIX system, just simulate the daemon
  46. mode by doing redirections and directory changing.
  47. """
  48. os.chdir(our_home_dir)
  49. os.umask(umask)
  50. sys.stdin.close()
  51. sys.stdout.close()
  52. sys.stderr.close()
  53. if err_log:
  54. sys.stderr = open(err_log, 'a', 0)
  55. else:
  56. sys.stderr = NullDevice()
  57. if out_log:
  58. sys.stdout = open(out_log, 'a', 0)
  59. else:
  60. sys.stdout = NullDevice()
  61.  
  62. class NullDevice:
  63. "A writeable object that writes to nowhere -- like /dev/null."
  64. def write(self, s):
  65. pass
  66.  
  67. def outputLog(sLog):
  68. print sLog
  69.  
  70. def toLog(sLog):
  71. sInfo = time.strftime("%y%m%d %H:%M:%S")
  72. sInfo += sLog
  73. outputLog(sInfo)
  74.  
  75. def Log_Info(sLog):
  76. toLog('Info\t' + sLog)
  77.  
  78. def Log_Error(sLog):
  79. toLog('error\t' + sLog)
  80.  
  81. def Log_Debug(sLog):
  82. toLog('debug\t' + sLog)
  83.  
  84. class TimerRunner:
  85. '''
  86. '''
  87. nTimeScds = 2 #时间间隔
  88. sCmd = 'calc'
  89. oTm = None
  90.  
  91. @classmethod
  92. def becomeDaemonize(cls):
  93. become_daemon()
  94.  
  95. @classmethod
  96. def RunCmd(cls):
  97. oSubPcs = subprocess.Popen(cls.sCmd, stdout=subprocess.PIPE, stderr = subprocess.PIPE)
  98. while True:
  99. nReturnCode = oSubPcs.poll()
  100. if 0 == nReturnCode:
  101. Log_Info(oSubPcs.stdout.read())
  102. break
  103. elif 0 > nReturnCode:
  104. Log_Error(oSubPcs.stderr.read())
  105. break
  106.  
  107. @classmethod
  108. def timerFun(cls):
  109. Log_Info("go to timer fun")
  110. cls.initTimer()
  111. cls.oTm.start() #再次启动计时,放在runcmd函数前,保证时间的准确性
  112. cls.RunCmd()
  113. Log_Info("exit timer fun")
  114.  
  115. @classmethod
  116. def initTimer(cls):
  117. cls.oTm = Timer(cls.nTimeScds, cls.timerFun)
  118.  
  119. @classmethod
  120. def run(cls):
  121. cls.initTimer()
  122. cls.timerFun()
  123. cls.becomeDaemonize()
  124.  
  125. def main():
  126. TimerRunner.run()

Python循环定时服务功能(相似contrab)的更多相关文章

  1. Python实现FTP服务功能

    本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...

  2. 【Python】 用python实现定时数据解析服务(前言)

    一.Why do it? 背景:项目里上传上来的数据都是未解析的数据,而且数据量还算挺庞大的,每天上传的数据有5kw左右,如果用数据库自带的作业来解析的话,数据库会造成严重的阻塞.因此打算把数据读到外 ...

  3. C# 创建Windows服务。服务功能:定时操作数据库 (转)

    C# 创建Windows服务.服务功能:定时操作数据库 一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在S ...

  4. python实现简单的循环购物车小功能

    python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s&quo ...

  5. Python +crontab定时备份目录发送邮件

    公司有一台静态页面展示服务器仅供给客户展示我们做的项目,当时买的时候是最低配,也就是磁盘空间为20G的系统盘,考虑到代码量很小所以没有另加磁盘,后来项目多了,就写了个crontab 定时备份目录. 就 ...

  6. [Java聊天室server]实战之五 读写循环(服务端)

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  7. python 循环语句 函数 模块

    python循环语句 while循环语法结构 当需要语句不断的重复执行时,可以使用while循环 while expression: while_suite 语句ehile_suite会被连续不断的循 ...

  8. Solr定时导入功能实现

    需要实现Solr定时导入功能的话,我们可以通过使用Solr自身所集成的dataimportscheduler调度器实现 下载对应的jar包,下载地址https://code.google.com/ar ...

  9. Python实现进度条功能

    Python实现进度条功能 import sys, time def progress(percent, width=50): # 设置进度条的宽度 if percent >= 100: # 当 ...

随机推荐

  1. [分享] IMX6嵌入式开发板linux QT挂载U盘及TF卡

    本文转自迅为开发板:http://www.topeetboard.com 开发平台:iMX6开发板 linux QT 系统下挂载 u 盘如下图所示,qt 启动之后,在超级终端中使用命令“mknod / ...

  2. 【git】搭建git服务器

    在 Linux 下搭建 Git 服务器 目录 ① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clon ...

  3. 《Java程序设计》课程试题

    < Java程序设计 >课程试题 一.单项选择题(20题:每题2分,共40分) 1.若数组a定义为int[][]a=new int[3][4],则a是___. A)一维数组 B)二维数组 ...

  4. 富文本编辑器复制Wod字体问题

    目前常用的富文本编辑器:百度版UEditor,wangEditor,ckeditor,kindeditor,TinyMCE.当Word复制文本粘贴到编辑器时,几乎都无法保证字体大小完全一致的问题. 想 ...

  5. selenium click radio

    radio = dr.find_element_by_xpath('//*[@id="contentTable"]/tbody/tr[1]/td[1]/input') webdri ...

  6. linux 服务脚本

    #!/bin/bash # # chkconfig: # description: my_SERVICE_NAME is a my Service # # common function . /etc ...

  7. MySQL异常:Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request

    Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or cl ...

  8. tomcat idea 报权限错误

    出现的错误提示如下: 下午9:11:27 All files are up-to-date下午9:11:27 All files are up-to-date下午9:11:27 Error runni ...

  9. Python之基础练习题

    Python之基础练习题 1.执行 Python 脚本的两种方式 2.简述位.字节的关系 解:8位是一个字节 3.简述 ascii.unicode.utf-8.gbk 的关系 4.请写出 “李杰” 分 ...

  10. Python中的列表(2)

    一.从列表中删除元素 使用del 语句删除. books = ['Pride and Prejudice','Jane Eyre','The Catcher in the Rye'] print(bo ...