Python監控服務進程及自啟動服務方法與實踐

1. 需求概述

當我們在Windows Server環境中部署XX系統的實際應用中,往往會遇到一些運維管理的挑戰。為了確保系統的持續穩定運行,特別是在服務程序因各種原因突然關閉的情況下,我們可以借助Python的強大生態系統來構建一個監控與自動重啟的管理工具。

在這個場景中,我使用了psutil第三方庫,它提供了跨平臺的系統進程和系統利用率信息。結合apscheduler用于定時任務的管理,以及subprocess用于啟動和監控服務程序,我打造了一個簡單而有效的監控系統。

首先,我使用psutil來獲取并篩選出系統中我們所關心的服務程序的進程。通過定時任務,我定期檢查該進程是否在運行,如果不存在,那么就啟動一個新的進程,確保服務不會因意外關閉而中斷。

下面是一個簡單的Python代碼示例,演示了如何使用這些庫來實現監控與自動重啟:

import psutil
import subprocess
from apscheduler.schedulers.blocking import BlockingScheduler# 設置服務程序的命令和路徑
service_command = "py_monitor TestMonitor.py"
service_path = "D:/03study/Test/App"def monitor_service():# 獲取所有進程all_processes = psutil.process_iter(attrs=['pid', 'name'])# 檢查服務程序是否在運行service_running = any(process.info['name'] == "python.exe"for process in all_processes)if not service_running:# 服務程序不存在,啟動新的進程subprocess.Popen(service_command, cwd=service_path, shell=True)print("Service restarted.")# 創建定時任務
scheduler = BlockingScheduler()
scheduler.add_job(monitor_service, 'interval', minutes=5)try:print("Monitoring and auto-restarting service...")scheduler.start()
except KeyboardInterrupt:# 用戶手動終止任務pass

注:此代碼參考自chatgpt,在windows平臺上,有些權限限制,process.cmdline()報錯,去掉。

請注意,這只是一個簡單的示例,實際中你可能需要根據具體情況進行更復雜的異常處理、日志記錄等。此外,確保你的系統允許定時任務的執行,例如在Linux中,可以使用cron等工具。

2. python監控技術

2.1. Python在系統監控中的應用

系統監控是保證計算機系統正常運轉的基礎,也是運維工作的核心之一。Python在系統監控中的應用非常廣泛,例如:

  • 監控進程和系統資源:Python可以通過內置的psutil模塊來監控運行中的進程以及系統資源的使用情況,如CPU、內存、磁盤等。
  • 監控網絡流量:Python可以通過scapy等第三方庫來監控網絡流量、分析流量內容、抓包等,有時還可以用來檢測網絡攻擊。
  • 自定義監控:Python可以通過自定義實現各種監控項,如監控服務、網站、日志等,自定義監控項可以更貼合具體業務需求。例如,可以通過發送ping包來檢測服務器是否能夠正常響應。
  • 報警處理:Python可以將監控數據通過郵件、短信等方式發送給管理員,一旦監控數據異常,可以及時觸發報警機制。這些報警機制可以在Python中用一些庫來實現,如smtplib、email、twilio等。

用Python來編寫腳本簡化日常的運維工作是Python的一個重要用途。在Linux下,有許多系統命令可以讓我們時刻監控系統運行的狀態,如ps,top,free等等。要獲取這些系統信息,Python可以通過subprocess模塊調用并獲取結果。但這樣做顯得很麻煩,尤其是要寫很多解析代碼。

在Python中獲取系統信息的另一個好辦法是使用psutil這個第三方 模塊。顧名思義,psutil = process and system utilities,它不僅可以通過一兩行代碼實現系統監控,還可以跨平臺使用,支持Linux/UNIX/OSX/Windows等,是系統管理員和運維小伙伴不可或缺的必備模塊。

2.2. psutil

psutil是一個跨平臺庫,能夠輕松實現獲取系統運行的進程和系統運行的信息(包括CPU、內存、磁盤、網絡等)。它主要用來做系統監控,性能分析,進程管理。它實現了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系統.
在這里插入圖片描述

2.3. 任務調度與啟動服務程序

2.3.1 APScheduler

APScheduler是一個用于任務調度和定時任務管理的Python庫。它提供了一個簡單而靈活的方式來定義、調度和執行任務。

2.3.2. subprocess 模塊

subprocess 模塊允許我們啟動一個新進程,并連接到它們的輸入/輸出/錯誤管道,從而獲取返回值。

subprocess 模塊首先推薦使用的是它的 run 方法,更高級的用法可以直接使用 Popen 接口。

run 方法語法格式如下:

	subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
  • args:表示要執行的命令。必須是一個字符串,字符串參數列表。
  • stdin、stdout 和 stderr:子進程的標準輸入、輸出和錯誤。
  • timeout:設置命令超時時間。如果命令執行時間超時,子進程將被殺死,并彈出 TimeoutExpired 異常。
  • check:如果該參數設置為 True,并且進程退出狀態碼不是 0,則彈 出 CalledProcessError 異常。
  • encoding: 如果指定了該參數,則 stdin、stdout 和 stderr 可以接收字符串數據,并以該編碼方式編碼。否則只接收 bytes 類型的數據。
  • shell:如果該參數為 True,將通過操作系統的 shell 執行指定的命令。
  • returncode: 執行完子進程狀態,通常返回狀態為0則表明它已經運行完畢,若值為負值 “-N”,表明子進程被終。

3. 實踐過程

3.1. psutil庫的安裝

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple psutil

3.2. 常用方法

3.2.1. 獲取系統信息示例

# coding:utf-8
import psutil
import datetime
import timenow_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
print('當前時間', now_time)
# 獲取系統啟動時間
print("系統啟動時間: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))print('----------------------------系統CPU信息---------------------------------------')
# 查看cpu物理個數的信息
print("物理CPU個數: %s" % psutil.cpu_count(logical=False))
# 查看cpu邏輯個數的信息
print("邏輯CPU個數: %s" % psutil.cpu_count(logical=True))
# cpu的使用率
cpu = (str(psutil.cpu_percent(1))) + '%'
print('當前1s內系統cup使用率: %s' % cpu)print('----------------------------系統內存信息---------------------------------------')
# 查看內存信息
total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
used = str(round(psutil.virtual_memory().used / (1024.0 * 1024.0 * 1024.0), 2))
memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print("物理總內存: %s G" % total)
print("已使用物理內存: %s G" % used)
print("剩余物理內存: %s G" % free)
print("物理內存使用率: %s %%" % int(memory * 100))print('----------------------------系統用戶信息---------------------------------------')
# 獲取系統用戶
users_count = len(psutil.users())
users_list = ", ".join([u.name for u in psutil.users()])
print("當前有 %s 個用戶,分別是 %s" % (users_count, users_list))print('----------------------------系統網卡信息---------------------------------------')
# 獲取網卡信息,可以得到得到網卡屬性,連接數,當前數據等信息
net = psutil.net_io_counters()
bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
bytes_recv = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
print("網卡接收數據 %s 網卡發送數據 %s" % (bytes_recv, bytes_sent))print('-----------------------------系統磁盤信息---------------------------------------')
# 獲取磁盤數據信息
io = psutil.disk_partitions()
print('系統當前所有的磁盤信息:{}'.format(io))
for i in io:try:o = psutil.disk_usage(i.device)print('磁盤名:{}'.format(i.device), end='\t')print("總容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G", end='\t')print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G", end='\t')print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")except PermissionError:continueprint('-----------------------------系統進程信息-------------------------------------')
# 查看系統全部進程
for pid in psutil.pids():p = psutil.Process(pid)print("進程名 %-20s 內存利用率 %-18s 進程狀態 %-10s 創建時間 %-10s " % (p.name(), p.memory_percent(), p.status(), p.create_time()))

輸出結果截取片段:

在這里插入圖片描述

3.2.2. 獲取網絡信息

獲取主機名與IP地址

import socket
hostname = socket.gethostname()
print(hostname)
print(socket.gethostbyname(hostname))

3.3. 應用實踐

import psutil
import time
import subprocessimport pytz
from apscheduler.schedulers.blocking import BlockingScheduler
from loguru import logger# 按進程名稱查詢進行
def find_procs_by_name(name):#"Return a list of processes matching 'name'."ls = []for p in psutil.process_iter(['name']):if p.info['name'] == name:ls.append(p)return ls# 監控進程列表
def monitorprocss():processname = [ 'pvforecast_py.exe','pvweather24_py.exe']cmdbat = ['D:\Python\PVMicrogrid\PVSystem\PVForecastAPScheduler.bat','D:\Python\PVMicrogrid\PVSystem\PVAPScheduler.bat']processe_command = [('start ' + processname[0] + ' PVForecastAPScheduler.py','D:\Python\PVMicrogrid\PVSystem' ),('start ' + processname[1] + ' PVAPScheduler.py','D:\Python\PVMicrogrid\PVSystem'),('start ' + processname[2] + ' PVTrainAPScheduler.py','D:\Python\PVMicrogrid\PVSystem')]for i in range(len(processname)):ls = find_procs_by_name(processname[i])if len(ls)>0:p = ls[0]# 獲取進程創建時間createtime = time.strftime('%Y-%m-%d %X', time.localtime(p.create_time())) #print('進程創建時間:', createtime)          if p.is_running():# 獲取該進程的內存利用率rate = p.memory_percent() logger.info(processname[i] + ',該進程的內存利用率:' + str(round(rate,2)))else:# 殺掉進程p.terminate()logger.info(processname[i] + ',進程創建時間:' + createtime)    else:# 重新啟動進行# 運行批處理文件,并獲取返回值#result = subprocess.run(cmdbat[i], shell=True)print('啟動服務程序:', processe_command[i][0])subprocess.Popen(processe_command[i][0], cwd=processe_command[i][1], shell=True)if __name__ == '__main__':logger.add("MonitorProcess_{time}.log")print('監控程序開始運行!')#monitorprocss()scheduler = BlockingScheduler(timezone=pytz.timezone("Asia/Shanghai") )#scheduler.add_job(monitorprocss, 'cron', minute = '00,10,20,30,40,50', second='00', misfire_grace_time=60, id='job1')scheduler.add_job(monitorprocss, 'interval', minutes = 1, id='job1')try:scheduler.start()except (KeyboardInterrupt, SystemExit):pass    

4. 總結

使用python開發系統監控工具,能快速實現個性化需求,短小而且精悍。其中,服務程序自啟動功能,可以替代“Windows環境中Python應用服務自啟動及其監控解決方法“所描述多個啟動批處理文件,直接使用此一個批處理文件”MonitorProcess.bat“,可以完全勝任。

@echo off
D:
cd D:\Python\PVMicrogrid\utils
start python Monitorprocess.py

部署代碼buildw.bat修改為:

chcp 65001copy D:\Python\PVMicrogrid\MonitorProcess.bat "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\MonitorProcess.bat"

注意:需要把…\Startup\MonitorProcess.bat文件加入安全防護白名單中。

通過這樣的監控與自動重啟工具,我們可以更好地保障應用服務系統的穩定性,及時應對各種潛在問題,確保服務始終處于可用狀態。

參考:

肖永威. Windows環境中Python應用服務自啟動及其監控解決方法. CSDN博客. 2023.11
習久性成. python第三方庫psutil(process and system utilities)庫詳解:獲取系統運行的進程和系統利用率(包括CPU、內存、磁盤、網絡等)信息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式鏈路追蹤入門篇-基礎原理與快速應用

為什么需要鏈路追蹤? 我們程序員在日常工作中,最常做事情之一就是修bug了。如果程序只是運行在單機上,我們最常用的方式就是在程序上打日志,然后程序運行的過程中將日志輸出到文件上,然后我們根據日志去推斷程序是哪一…

Comsol Multiphysics 6.2 for Mac建模仿真軟件

COMSOL Multiphysics是一款多物理場仿真軟件,旨在幫助工程師、科學家和研究人員解決各種復雜的工程和科學問題。該軟件使用有限元分析方法,可以模擬和分析多個物理場的相互作用,包括結構力學、熱傳導、電磁場、流體力學和化學反應等。 COMSOL…

一些好用的前端小插件(轉自知乎)

一些好用的前端小插件(2) 1. cropper.js Cropper.js 2.0 是一系列用于圖像裁剪的 Web 組件。 官網地址:https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款瀏覽器端的 Markdown 編輯器,支持所見即所得、…

2024年度投資策略:AI大模型和半導體國產化加速

今天分享的是AI系列深度研究報告:《2024年度投資策略:AI大模型和半導體國產化加速》。 (報告出品方:東方證券) 報告共計:48頁 前言: 行情回顧與未來展望 電子板塊漲幅轉正,信心逐漸回歸。截至…

人人都會Blazor —— 3.3 參數

參數最常見的使用,目的是使組件可以接收動態數據。 聲明參數 參數使用 [Parameter] 特性的公共 C# 屬性進行定義。 在下面的示例中,內置引用類型 (System.String) 和用戶定義的引用類型 (PanelBody) 作為組件參數進行傳遞。 PanelBody.cs: public class PanelBody {publ…

SQL注入漏洞發現和利用,以及SQL注入的防護

一、背景 SQL注入漏洞是一種常見的軟件安全問題,它發生在應用程序的數據庫層中。其核心原理是將用戶輸入的數據當做代碼來執行,違反了“數據與代碼分離”的原則。具體來說,攻擊者通過構造惡意的SQL查詢語句,使得應用程序在執行SQ…

Android NFC手機上實現卡模擬

1, 問:能否在AndroidNFC手機上實現卡模擬? 答:在技術上可行,但是,對一般開發人員來講,目前看來僅僅是技術上可行。 2, 問:具體如何實現呢? 答&#xff1…

git的使用記錄

GitHub是公有的遠程倉庫,Gitlab是私有的遠程倉庫。 git add file git commit -m "add file" git mv filea fileb git log 顯示提交記錄 git log --oneline 一行的簡略信息顯示 git log --oneline --decorate 顯示當前指針 git reset --ha…

矩陣知識補充

正交矩陣 定義: 正交矩陣是一種滿足 A T A E A^{T}AE ATAE的方陣 正交矩陣具有以下幾個重要性質: A的逆等于A的轉置,即 A ? 1 A T A^{-1}A^{T} A?1AT**A的行列式的絕對值等于1,即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

通用功能——git 攻略

摘要 本文主要介紹git常用命令的使用方法,同時介紹一些常見問題的處理方法,持續更新中… git命令通用選項 大多數git命令都適用的選項列表如下: -v, --verbose show hash and subject, give twice for upstream branch -q, --quie…

Vim 一下日志文件,Java 進程沒了?

一次端口告警,發現 java 進程被異常殺掉,而根因竟然是因為在問題機器上 vim 查看了 nginx 日志。下面我將從時間維度詳細回顧這次排查,希望讀者在遇到相似問題時有些許啟發。 時間線 15:19 收到端口異常 odin 告警。 狀態:P1故障 名稱:應用端…

黑馬點評筆記 redis實現優惠卷秒殺

文章目錄 難題全局唯一IDRedis實現全局唯一Id 超賣問題問題解決方案樂觀鎖問題 一人一單 難題 要解決優惠卷秒殺的問題我們要考慮到三個個問題,全局唯一ID,超賣問題,一人一單。 全局唯一ID 用戶搶購時,就會生成訂單并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替換成本地下載編譯安裝解決網絡超時問題

目錄 🌑🌑 背景 🌒 🌒作用 🌔🌔 問題 🌔🌔解決方案 🌙方法一 🌙方法二 🌝🌝我的解決方案 整理不易,歡迎一鍵三連…

7-12 統計投票情況(集合)

7-12 統計投票情況(集合) 分數 10 作者 python課程組 單位 福州大學至誠學院 利用集合分析活動投票情況。 第一小隊有五名隊員,序號是1,2,3,4,5;第二小隊也有五名隊員,序號6,7,8,9,10。 輸入一個由得票隊員編號組成的…

分布式篇---第三篇

系列文章目錄 文章目錄 系列文章目錄前言一、什么是補償事務?二、消息隊列是怎么實現的?三、那你說說Sagas事務模型前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,看懂了就去分享給你的碼吧。…

qgis添加postgis數據

左側瀏覽器-PostGIS-右鍵-新建連接 展開-雙擊即可呈現 可以點擊編輯按鈕對矢量數據編輯后是直接入庫的,因此謹慎使用。

【DQN】基于pytorch的強化學習算法Demo

目錄 簡介代碼 簡介 DQN(Deep Q-Network)是一種基于深度神經網絡的強化學習算法,于2013年由DeepMind提出。它的目標是解決具有離散動作空間的強化學習問題,并在多個任務中取得了令人矚目的表現。 DQN的核心思想是使用深度神經網…

企業數字化轉型的作用是什么?_光點科技

在當今快速變化的商業環境中,數字化轉型已成為企業發展的重要策略。企業數字化轉型指的是利用數字技術改造傳統業務模式和管理方式,以提升效率、增強競爭力和創造新的增長機會。 提升運營效率:數字化轉型通過引入自動化工具和智能系統&#x…

指數退避重試

指數退避重試(Exponential Backoff and Retry)是一種網絡通信中常用的錯誤處理和重試策略。它通常用于處理臨時性的故障,例如網絡延遲、服務器過載或臨時性的錯誤,以提高系統的可靠性和穩定性。 基本思想是,當發生一個…

NX二次開發UF_CSYS_ask_wcs 函數介紹

文章作者:里海 來源網站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…