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項目就完成了,沒有把完整代碼發出來,是想讓大家都親手都實踐一下。

  歡迎大家討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM