python監(jiān)控windows服務(wù)器的進程和服務(wù)
需求:軟件公司提供的軟件服務(wù)在服務(wù)器上會莫名其妙的掛掉,他們采用的方法也只有重啟服務(wù)器,重啟時間太久了,所以想弄一個監(jiān)測進程和服務(wù)的程序,監(jiān)測到掛了就重啟進程或者服務(wù)
import psutil
import time
import subprocess
import logging
import logging.handlers
import wmi
import ctypes
import os
# 獲取服務(wù)狀態(tài)
def get_service_status(service_names):
wmiobj = wmi.WMI()
for service_name in service_names:
services = wmiobj.Win32_Service(Name = service_name)
if services:
# 服務(wù)狀態(tài)是停止就開啟服務(wù)
if services[0].state == "Stopped":
start_service(service_name)
# return services[0].state
else:
logging.error(f"失敗:服務(wù){(diào)service_name}不存在")
#判斷是否有管理員權(quán)限
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
# 啟動服務(wù)
def start_service(service_name):
if is_admin():
try:
cmd = 'NET START {}'.format(service_name)
os.popen(cmd)
logging.warning(f"成功:啟動了服務(wù){(diào)service_name}")
except Exception as e:
logging.error(f"失?。簡臃?wù){(diào)service_name}失敗, 錯誤信息: {e}")
else:
logging.warning(f"不是admin權(quán)限")
# 日志配置
def loggingstars():
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
logger.addHandler(handler)
file_handler = logging.handlers.RotatingFileHandler(filename='process_name.log', maxBytes=1024*1024*90, backupCount=10)
file_handler.setLevel(logging.WARNING)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# 獲取掉線的進程完整執(zhí)行路徑
def find_process_by_name(process_names):
all__process = set()
"""獲取所有進程的完成路徑"""
for proc in psutil.process_iter(['pid', 'name','exe']):
all__process.add(proc.info['exe'])
""" 找出掉線的監(jiān)控進程的完整路徑 """
new_list = [item for item in process_names if item not in all__process]
return new_list
def start_process(process_names, service_anmes):
while True:
# 檢查服務(wù)是否啟動
get_service_status(service_anmes)
time.sleep(60)
stop_process = find_process_by_name(process_names)
if not stop_process:
continue
""" 啟動掉線的進程 """
for app in stop_process:
try:
subprocess.Popen(f"{app}")
logging.warning(f"成功:啟動了進程{app}")
except Exception as e:
logging.error(f"失?。簡舆M程{app}失敗, 錯誤信息: {e}")
# 如果需要啟動進程的話,暫停20分鐘
time.sleep(20*60)
if __name__ == "__main__":
loggingstars()
logging.warning("============== 進程監(jiān)控程序啟動 ============")
# 需要監(jiān)測的進程,為什么使用可執(zhí)行文件,是因為發(fā)現(xiàn)有進程名會相同
process_names = [
"C:\\UserApp\\app\\baidu-translate-client\\百度翻譯.exe",
"C:\\UserApp\\app\\dingding\\main\\current\\DingTalk.exe"
]
# 需要監(jiān)測的服務(wù)名
service_anmes = ["MySQL80", "JetBrainsEtwHost"]
start_process(process_names, service_anmes)其實服務(wù)也是啟動執(zhí)行文件然后有一個進程,如果找到所有服務(wù)的進程直接寫進程監(jiān)控就可以了,這里只是展示一下怎么監(jiān)控服務(wù)和進程
有些服務(wù)或者進程的啟動可能有順序
- 打開 運行 輸入 “msinfo32”
- 選擇 “軟件環(huán)境” 再點擊 "正在運行任務(wù)"就可疑查看啟動時間
打包就用 Pyinstaller -F xx.py,然后放到服務(wù)器上
到此這篇關(guān)于python監(jiān)控windows服務(wù)器的進程和服務(wù)的文章就介紹到這了,更多相關(guān)python監(jiān)控服務(wù)器進程和服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)提取JSON數(shù)據(jù)中的鍵值對并保存為.csv文件
這篇文章主要為大家詳細介紹了如何基于Python實現(xiàn)讀取JSON文件數(shù)據(jù),并將JSON文件中指定的鍵值對數(shù)據(jù)轉(zhuǎn)換為.csv格式文件,感興趣的小伙伴可以了解下2023-09-09
python3實現(xiàn)抓取網(wǎng)頁資源的 N 種方法
這兩天學(xué)習(xí)了python3實現(xiàn)抓取網(wǎng)頁資源的方法,發(fā)現(xiàn)了很多種方法,所以,今天添加一點小筆記。2017-05-05
詳解Python 實現(xiàn)元胞自動機中的生命游戲(Game of life)
本篇文章主要介紹了詳解Python 實現(xiàn)元胞自動機中的生命游戲(Game of life),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01

