zoukankan      html  css  js  c++  java
  • Python-windows服务-重启自动化

    一. 前言

      有了上一篇的“python初学”的基础,咱们就有了python的开发包,有了开发环境IDE,那我们就可以干活了。我的第一个选题就是让我们的windows服务可以按照我们的意愿进行自动重启。

      再说一下现在面临的问题吧,我们公司的平台服务是是基于windows服务开发,那如果我想做更新时,就要有如下的步骤:

      1. 停止正在运行的win服务。

      2. 复制指定文件夹下的DLL,粘贴到目标路径。

      3. 删除日志(便于查看启动日志,当然删不删由你)

      4. 重启服务。

      步骤很简单,不过如果每次都这样进行手工操作的话,那是不是有点笨拙了呢,用咱们软件开发原则的话说:don't repeat yourself。

      不过我也是新手,有不对的地方,还请大家指教啊,那我们现在就开始:

    二.新建项目

      找了半天,没有找到新建项目的快捷键,不过可以使用alt+F,再加下箭头回车,一样可以,当然也可以自定义shortkey.我只装了一个python3.3,python可以同时允许我们安装多个版本的python,具体项目选择哪个,可以在这里选择。回车,项目就创建完了。

    三. 新建python文件

      快捷键:alt+insert 允许我们新建一个Directory,Python Package,但咱这个没那么大,一个python File 就足够了。

      至于名字我也不纠结了,还是与项目名一样吧,

       后面那个__autthor是IDE给我自动生成的,你可以配置一下,让它自动给生成什么,位置见下图:

      

      我看到很多人都在这里设置了字符编码,不过目前我还没有遇到过相关的问题,以后再说吧。

    四。开始coding

      在正式coding之前,我们先前分析一下,这个程序的运行过程:

      1. 判断一下,要拷贝的文件是否存在,不存在就什么都不用做了。

      2. 判断指定服务是否正在运行。(如果没有运行,还就简单了),如果运行,那就停掉它。

      3. 判断一下,日志文件是否存在,如存在,就删除它。

      4. copy DLL 文件到指定目录。

      5. 启动服务。

      好了,思路有了,开始编码吧,直接上代码:

      1. 判断一下,要拷贝的文件是否存在,不存在就什么都不用做了。初学python的要注意缩进,python是用缩进划定方法,类,甚至是if,else的作用域的。

    import os
    src = "C:\CTIL\dblogic\dbLogic.dll"
    if not os.path.exists(src):
        exit()
    

       2. 判断指定服务是否正在运行。(如果没有运行,还就简单了),如果运行,那就停掉它。

        这里我定义一个方法,主程序直接调用它就行了。这里插一句,好像写python的人变量和方法,文件名,都习惯用小写。

    def stopservice(name):
        result = os.popen("sc query %s" % name).read()
        if "RUNNING" in result:
            logger.info("The Service %s is running........" % name)
            os.popen("sc stop %s" % name).read()
            logger.info("Stop Service ........")
            time.sleep(60)
        elif "START_PENDING" in result:
            logger.info("The Service  %s is starting........" % name)
            time.sleep(10)
            os.popen("sc stop %s" % name).read()
            logger.info("Stop Service ........")
            time.sleep(10)
        elif "STOP_PENDING" in result:
            logger.info("The Service  %s is stopping........" % name)
            time.sleep(10)
        elif "STOPPED" in result:
            logger.info("The Service  %s stopped........" % name)
        else:
            logger.info("The Service %s is in other status........" % name)

       这里写的有点啰嗦,主要是写告诉大家,服务运行过程可能有多个状态,咱们最好还是考虑全一些。这里呢,我加了日志记录功能,以后有机会再和大家分享关于python日志方面的东东,这里还有一个方法,time.sleep(10),聪明的你一定知道它是什么意思了,这里不多说了。

      

      3. 判断一下,日志文件是否存在,如存在,就删除它。直接上方法

    def deleteFile(filepath):
        if os.path.isfile(filepath):
            try:
                os.remove(filepath)
            except:
                print("delete File failure: %s" % filepath)
        elif os.path.isdir(filepath):
            for item in os.listdir(filepath):
                itemsrc = os.path.join(filepath, item)
                deleteFile(itemsrc)
            try:
                os.rmdir(filepath)
            except:
                print("delete Folder failure: %s" % filepath)

       这里有点小说明,就是这个deletefile方法的接收参数既可以是文件,也可以是文件夹,删除呢也是采用两种方式。还里还有一个小的异常处理,有点小特别吧。

      4. copy DLL 文件到指定目录。

         这个也是比较简单:

    shutil.copyfile(src, target)

      5. 启动服务。

    def startservice(name):
        logger.info("The Service %s is starting....... "  % name)
        os.popen("sc start %s" % name).read()
        time.sleep(60)
        result = os.popen("sc query %s" % name).read()
        if "RUNNING" in result:
            logger.info("The Service started Succesivlly")

     五. 部署

      代码写完了,调试几个,就可以运行了,那么如何把它放在服务器上运行呢,一开始我想是不是也要打个包什么的呢,也找了些工具,不过后来,我想这么小的东西,还是直接放上去得了,大不了安装一下python。

    六. 结语

      我的第一个Python项目就完成了,没有把完整代码发出来,是想让大家都亲手都实践一下。

      欢迎大家讨论。

  • 相关阅读:
    Kafka-1
    消息队列
    分布式分类
    认识分布式
    数据库引擎
    Django插入多条数据—bulk_create
    Django中update和save()同时作用
    联合唯一去重的SQL
    Direct3D11学习:(三)Direct3D11初始化
    Direct3D11学习:(零)常见问题及解决方法整理
  • 原文地址:https://www.cnblogs.com/hankuikui/p/3481967.html
Copyright © 2011-2022 走看看