? ? 最近比較煩,研發給的pc服務版本在虛擬機上已經開始給客戶使用了,服務老是莫名的死翹翹,客戶不停的電話給我,搞的我心情很差,于是在一個下午,靜下心來,用python寫了個簡單的監控進程的腳本,當發現進程消失的時候,立即調用服務,開啟服務。。。
? ?腳本的工作原理是這樣的:腳本讀取配置文件,讀取預先配置好的調用系統服務的路徑和所要監控的服務在進程管理器中的進程名,之所以要用配置文件,是為了方便給需要的朋友,你只需要修改進程名和系統路徑,源代碼就不需要修改了。具體的看代碼中的注釋吧。。。下面的是配置文件 config.ini
- [MonitorProgramPath]?
- ProgramPath:?C:\Program?Files\SSH?Communications?Security\SSH?Secure?Shell\SshClient.exe?
- ?
- [MonitorProcessName]?
- ProcessName:?SshClient.exe?
上面可以根據你的需求配置不同的路徑和進程名,我是需要監控SshClient.exe 這個程序,那就配置好他的調用的系統路徑和他在任務管理器里面的進程名。
下面來看看代碼:
?
- ?
- 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秒調用腳本看下服務是否正常,如果不正常則重啟服務,如果正常,則打印服務正常
- ?????????
win10 python?? ?呵呵,腳本還是很簡單的,需要的朋友可以拿去玩玩,只要修改配置文件就可以了,不需要修改源代碼,就能拿去跑跑,希望對大家的工作和學習有幫助,如果在使用中有問題,可以給我建議。。。