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

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

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import subprocess
from threading import Timer
import time
import os
import sys

if 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 fork
        try:
            if os.fork() > 0:
                sys.exit(0)     # kill off parent
        except 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 fork
        try:
            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, se
else:
    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 daemon
        mode 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):
            pass

def outputLog(sLog):
    print sLog

def toLog(sLog):
    sInfo = time.strftime("%y%m%d %H:%M:%S")
    sInfo += sLog
    outputLog(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

    @classmethod
    def becomeDaemonize(cls):
        become_daemon()

    @classmethod
    def 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())
                break
            elif 0 > nReturnCode:
                Log_Error(oSubPcs.stderr.read())
                break

    @classmethod
    def timerFun(cls):
        Log_Info("go to timer fun")
        cls.initTimer()
        cls.oTm.start() #再次启动计时,放在runcmd函数前,保证时间的准确性
        cls.RunCmd()
        Log_Info("exit timer fun")

    @classmethod
    def initTimer(cls):
        cls.oTm = Timer(cls.nTimeScds, cls.timerFun)

    @classmethod
    def run(cls):
        cls.initTimer()
        cls.timerFun()
        cls.becomeDaemonize()

def main():
    TimerRunner.run()
时间: 2024-10-07 22:19:05

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

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

python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s", 5000), ("book python", 81), ("iwach", 3200), ("电视机", 2200) ] def zero(name): if len(name) == 0: print("\033[31;1m您的输

10min手写(五):面试题解析丨Python实现tail -f功能

作者:蜗牛 shengxinjing (woniuppp) · GitHub 写这篇文章的初衷是有人去面试遇到了这个笔试题,不知道怎么做,没有什么思路,就发到了Reboot 的交流群里,让大家一起讨论讨论. 关于这道题,简单说一下我的想法吧.当然,也有很好用的 pyinotify 模块专门监听文件变化,不过我更想介绍的,是解决的思路.毕竟作为面试官,还是想看到一下解决问题的思路,而且我觉得这一题的难点不在于监控文件增量,而在于怎么打印最后面10行. 希望大家在读这篇文章前,对 Python 基础

值得收藏!16段代码入门Python循环语句

[ 导读 ]本文重点讲述for语句和while语句.for语句属于遍历循环,while语句属于当型循环.除了两个循环语句外,还介绍了break.continue与pass三个用于控制循环结构中的程序流向的语句.在此基础之上,也介绍了列表推导式,这是一种特殊的循环语句. 循环语句又称为重复结构,用于反复执行某一操作.面对大数量级的重复运算,即使借助计算机,重复编写代码也是费时的,这时就需要借助循环语句.使用循环语句一般要用到条件判断,根据判断式的返回值决定是否执行循环体. 循环分为两种模式,一种是

Java:利用java Timer类实现定时执行任务的功能

一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务,具体要执行的代码写在TimerTask需要被实现的run方法中. 二.先看一个最简单的例子 我们通过代码来说明 import java.text.SimpleDateFormat; import java.util.Date; import java.util.Ti

Python循环常见的语法错误有哪些?

本文和大家分享的主要是python循环下最易错的一些语法,一起来看看吧,希望对大家学习python有所帮助. 循环语句下break和continue的区别和作用 break和continue都是用来控制循环结构的,主要是停止循环. · break break用于完全结束一个循环,跳出循环体执行循环后面的语句. for x in range(10): if x == 5: break print(x)print('for循环终止') break循环不是等循环条件为False才终止,打印结果为: 0

用python写windows服务

用python写windows服务(1) 以python2.5 为例需要软件 * python 2.5        * pywin32(与2.5 版本相匹配的) Service Control Manager (SCM) 服务管理器(SCM) 是windows NT的 一部分,所有服务必须通过SCM 注册,SCM负责启动,停止服务等. 当一个进程通过SCM注册后, 有如下特质: * 运行该进程的用户,未必是当前登录的用户.        * 该进程如果依赖其他服务,哪么该服务启动前,依赖服务回

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

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

Solr定时导入功能实现

需要实现Solr定时导入功能的话,我们可以通过使用Solr自身所集成的dataimportscheduler调度器实现 下载对应的jar包,下载地址https://code.google.com/archive/p/solr-dataimport-scheduler/downloads 通过WinRAR打开jar包我们发现里面有一个名叫dataimport.properties的配置文件 ################################################# # #

SAP B1 9.1开启邮件定时发送功能

SAP B1 9.1开启邮件定时发送功能需要几个步骤 1.服务端开启SBO Mailer 2.配置发件箱 3.设置警报提示管理 注意: 1.登陆人发件箱必须使用服务端上配置的发件箱,用户缺省设置邮箱也要为发件箱 2.设置好发送频率后,不管发件人是否登陆系统,邮件都会自动发送