Python循环定时服务功能(类似contrab)

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

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

#!/usr/bin/env python# -*- coding: utf-8 -*-#import subprocessfrom threading import Timerimport timeimport osimport sysif os.name == 'posix':def become_daemon(our_home_dir='.', out_log='/dev/null',err_log='/dev/null', umask=0o022):"Robustly turn into a UNIX daemon, running in our_home_dir."# First forktry:if os.fork() > 0:sys.exit(0)# kill off parentexcept OSError as e:sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))sys.exit(1)os.setsid()os.chdir(our_home_dir)os.umask(umask)# Second forktry:if os.fork() > 0:os._exit(0)except OSError as e:sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))os._exit(1)si = open('/dev/null', 'r')so = open(out_log, 'a+', 0)se = open(err_log, 'a+', 0)os.dup2(si.fileno(), sys.stdin.fileno())os.dup2(so.fileno(), sys.stdout.fileno())os.dup2(se.fileno(), sys.stderr.fileno())# Set custom file descriptors so that they get proper buffering.sys.stdout, sys.stderr = so, seelse:def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=0o022):"""If we're not running under a POSIX system, just simulate the daemonmode by doing redirections and directory changing."""os.chdir(our_home_dir)os.umask(umask)sys.stdin.close()sys.stdout.close()sys.stderr.close()if err_log:sys.stderr = open(err_log, 'a', 0)else:sys.stderr = NullDevice()if out_log:sys.stdout = open(out_log, 'a', 0)else:sys.stdout = NullDevice()class NullDevice:"A writeable object that writes to nowhere — like /dev/null."def write(self, s):passdef outputLog(sLog):print sLogdef toLog(sLog):sInfo = time.strftime("%y%m%d %H:%M:%S")sInfo += sLogoutputLog(sInfo)def Log_Info(sLog):toLog('Info\t' + sLog)def Log_Error(sLog):toLog('error\t' + sLog)def Log_Debug(sLog):toLog('debug\t' + sLog)class TimerRunner:''''''nTimeScds = 2 #时间间隔sCmd = 'calc'oTm = None@classmethoddef becomeDaemonize(cls):become_daemon()@classmethoddef RunCmd(cls):oSubPcs = subprocess.Popen(cls.sCmd, stdout=subprocess.PIPE, stderr = subprocess.PIPE)while True:nReturnCode = oSubPcs.poll()if 0 == nReturnCode:Log_Info(oSubPcs.stdout.read())breakelif 0 > nReturnCode:Log_Error(oSubPcs.stderr.read())break@classmethoddef timerFun(cls):Log_Info("go to timer fun")cls.initTimer()cls.oTm.start() #再次启动计时,放在runcmd函数前,保证时间的准确性cls.RunCmd()Log_Info("exit timer fun")@classmethoddef initTimer(cls):cls.oTm = Timer(cls.nTimeScds, cls.timerFun)@classmethoddef run(cls):cls.initTimer()cls.timerFun()cls.becomeDaemonize()def main():TimerRunner.run()

生命不息,在任何一种博大的辉煌之后,都掩藏着许多鲜为人知的艰难的奋斗。

Python循环定时服务功能(类似contrab)

相关文章:

你感兴趣的文章:

标签云: