最近比較煩,研發給的pc服務版本在虛擬機器上已經開始給客戶使用了,服務老是莫名的死翹翹,客戶不停的電話給我,搞的我心情很差,於是在一個下午,靜下心來,用python寫了個簡單的監控進程的指令碼,當發現進程消失的時候,立即調用服務,開啟服務。。。
指令碼的工作原理是這樣的:指令碼讀取設定檔,讀取預先配置好的調用系統服務的路徑和所要監控的服務在進程管理器中的進程名,之所以要用設定檔,是為了方便給需要的朋友,你只需要修改進程名和系統路徑,原始碼就不需要修改了。具體的看代碼中的注釋吧。。。下面的是設定檔 config.ini
[MonitorProgramPath] ProgramPath: C:\Program Files\SSH Communications Security\SSH Secure Shell\SshClient.exe [MonitorProcessName] ProcessName: SshClient.exe
上面可以根據你的需求配置不同的路徑和進程名,我是需要監控SshClient.exe 這個程式,那就配置好他的調用的系統路徑和他在工作管理員裡面的進程名。
下面來看看代碼:
#-*- encoding: utf-8 -*- import logging import wmi import os import time from ConfigParser import ConfigParser CONFIGFILE = 'config.ini'config = ConfigParser() config.read(CONFIGFILE) ProgramPath = config.get('MonitorProgramPath','ProgramPath') ProcessName = config.get('MonitorProcessName','ProcessName') #讀取設定檔中的進程名和系統路徑,這2個參數都可以在設定檔中修改 ProList = [] #定義一個列表 c = wmi.WMI() def main(): for process in c.Win32_Process(): ProList.append(str(process.Name)) #把所有工作管理員中的進程名添加到列表 if ProcessName in ProList: #判斷進程名是否在列表中,如果是True,則所監控的服務正在 運行狀態, #列印服務正常運行 print '' print "Server is running..." print '' else: #如果進程名不在列表中,即監控的服務掛了,則在log檔案下記錄日誌 #記錄檔名是以年月日為檔案名稱 f=open('.\\log\\'+time.strftime("%Y%m%d", time.localtime())+'-exception.txt','a') print 'Server is not running,Begining to Restart Server...'#列印服務狀態 f.write('\n'+'Server is not running,Begining to Restart Server...'+'\n') f.write(time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime()) +'\n') #寫入時間和服務狀態到記錄檔中 os.startfile(ProgramPath) #調用服務重啟 f.write('Restart Server Success...'+'\n') f.write(time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime())) f.close() #關閉檔案 print 'Restart Server Success...' print time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime()) del ProList[:] #清空列表,否則列表會不停的添加進程名,會佔用系統資源 if __name__=="__main__" : while True: main() time.sleep(10) #每隔10秒呼叫指令碼看下服務是否正常,如果不正常則重啟服務,如果正常,則列印服務正常
呵呵,指令碼還是很簡單的,需要的朋友可以拿去玩玩,只要修改設定檔就可以了,不需要修改原始碼,就能拿去跑跑,希望對大家的工作和學習有協助,如果在使用中有問題,可以給我建議。。。
本文出自 “你是路人甲還是霍元甲” 部落格,請務必保留此出處http://world77.blog.51cto.com/414605/782935