Python高級技巧之利用psutil和subprocess實(shí)現(xiàn)程序監(jiān)控與管理
1.簡介
在關(guān)鍵的應(yīng)用程序中,監(jiān)聽程序的運(yùn)行狀態(tài)十分重要,因?yàn)槠淇梢源_保程序的平穩(wěn)運(yùn)行。本文將介紹如何使用Python實(shí)現(xiàn)這一功能,這里主要使用psutil
和subprocess
模塊。同時(shí),最后會提供一個(gè)完整的腳本案例供參考,用于監(jiān)控并在目標(biāo)程序意外停止時(shí)重啟程序。
2.subprocess模塊介紹
subprocess
模塊是 Python 中用于創(chuàng)建和管理子進(jìn)程的標(biāo)準(zhǔn)庫模塊。它允許你執(zhí)行系統(tǒng)命令或其他可執(zhí)行文件,獲取它們的輸出,以及與其交互。下面是一些 subprocess
模塊的基本用法和示例:
1. 運(yùn)行外部命令
你可以使用 subprocess.run()
函數(shù)來運(yùn)行外部命令,并等待其完成:
import subprocess # 運(yùn)行一個(gè)簡單的命令 result = subprocess.run(['ls', '-l'], capture_output=True, text=True) # 打印命令輸出 print(result.stdout)
['ls', '-l']
是一個(gè)示例命令,它列出當(dāng)前目錄的詳細(xì)文件信息。capture_output=True
表示捕獲命令的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。text=True
表示輸出以文本字符串的形式返回,而不是字節(jié)。
2. 后臺執(zhí)行命令
如果你希望命令在后臺執(zhí)行而不阻塞當(dāng)前進(jìn)程,可以使用 subprocess.Popen
類:
import subprocess # 后臺執(zhí)行命令 process = subprocess.Popen(['python', 'target.py']) # 等待命令完成 process.wait()
3. 獲取命令輸出
如果需要獲取命令的輸出,可以使用 subprocess.check_output()
函數(shù):
import subprocess # 獲取命令輸出 output = subprocess.check_output(['echo', 'Hello, subprocess!'], text=True) # 打印輸出 print(output)
4. 傳遞輸入給命令
有時(shí)候需要將數(shù)據(jù)傳遞給命令的標(biāo)準(zhǔn)輸入??梢允褂?nbsp;subprocess.Popen.communicate()
方法來實(shí)現(xiàn):
import subprocess # 啟動(dòng)命令并傳遞輸入 process = subprocess.Popen(['grep', 'Python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True) # 向命令輸入數(shù)據(jù) output, _ = process.communicate('Python is awesome!') # 打印命令輸出 print(output)
5. 處理命令返回值
通過 subprocess.run()
或 subprocess.Popen.wait()
可以獲取命令的返回值,通常是命令的退出代碼。這可以幫助你判斷命令是否成功執(zhí)行。
3.psutil模塊介紹
psutil
(Python System and Process Utilities)模塊是一個(gè)跨平臺的庫,提供了方便的接口來獲取系統(tǒng)信息和管理進(jìn)程。它可以用于監(jiān)控系統(tǒng)資源的使用情況、管理進(jìn)程以及執(zhí)行系統(tǒng)管理任務(wù)。以下是 psutil
模塊的一些主要功能和使用示例:
1. 安裝 psutil
首先確保你已經(jīng)安裝了 psutil
模塊。如果沒有安裝,可以通過 pip 安裝:
pip install psutil
2. 獲取系統(tǒng)信息
使用 psutil
可以輕松地獲取系統(tǒng)的各種信息,如 CPU 使用率、內(nèi)存使用情況、磁盤分區(qū)信息等。
import psutil # 獲取 CPU 邏輯核心數(shù) cpu_count = psutil.cpu_count(logical=True) print(f"CPU 邏輯核心數(shù): {cpu_count}") # 獲取內(nèi)存使用情況 memory = psutil.virtual_memory() print(f"總內(nèi)存: {memory.total / 1024 / 1024} MB") print(f"已使用內(nèi)存: {memory.used / 1024 / 1024} MB") # 獲取磁盤分區(qū)信息 disk_partitions = psutil.disk_partitions() for partition in disk_partitions: print(f"分區(qū)設(shè)備: {partition.device}, 文件系統(tǒng): {partition.fstype}")
3. 獲取進(jìn)程信息
psutil
可以用來獲取系統(tǒng)中運(yùn)行的進(jìn)程信息,包括進(jìn)程列表、CPU 使用率、內(nèi)存使用情況等。
import psutil # 獲取所有進(jìn)程列表 all_processes = list(psutil.process_iter()) for proc in all_processes[:5]: # 打印前五個(gè)進(jìn)程 print(f"進(jìn)程名: {proc.name()}, PID: {proc.pid}") # 獲取指定 PID 進(jìn)程的詳細(xì)信息 pid = 1234 # 替換成你要查看的進(jìn)程 PID if psutil.pid_exists(pid): process = psutil.Process(pid) print(f"進(jìn)程名稱: {process.name()}") print(f"進(jìn)程狀態(tài): {process.status()}") print(f"進(jìn)程創(chuàng)建時(shí)間: {process.create_time()}") print(f"進(jìn)程 CPU 使用率: {process.cpu_percent(interval=1)}%") print(f"進(jìn)程內(nèi)存使用情況: {process.memory_info().rss / 1024 / 1024} MB") else: print(f"PID {pid} 對應(yīng)的進(jìn)程不存在。")
4. 進(jìn)程管理操作
psutil
還允許對進(jìn)程進(jìn)行管理操作,如終止進(jìn)程、發(fā)送信號等。
import psutil # 終止指定 PID 的進(jìn)程 pid_to_terminate = 5678 # 替換成你要終止的進(jìn)程 PID if psutil.pid_exists(pid_to_terminate): process = psutil.Process(pid_to_terminate) process.terminate() print(f"進(jìn)程 {pid_to_terminate} 已終止。") else: print(f"PID {pid_to_terminate} 對應(yīng)的進(jìn)程不存在。")
5. 實(shí)時(shí)監(jiān)控系統(tǒng)資源
使用 psutil
可以實(shí)現(xiàn)實(shí)時(shí)監(jiān)控系統(tǒng)資源使用情況,例如在一個(gè)循環(huán)中獲取 CPU 使用率:
import psutil # 實(shí)時(shí)監(jiān)控 CPU 使用率 while True: cpu_percent = psutil.cpu_percent(interval=1) print(f"當(dāng)前 CPU 使用率: {cpu_percent}%")
這些示例展示了 psutil
模塊在系統(tǒng)信息獲取、進(jìn)程管理和系統(tǒng)資源監(jiān)控方面的基本用法。根據(jù)具體需求,你也可以進(jìn)一步深入使用 psutil
的其他功能來實(shí)現(xiàn)更復(fù)雜的系統(tǒng)管理和監(jiān)控任務(wù)。
4.實(shí)戰(zhàn)應(yīng)用
下面是一個(gè)使用subprocess
模塊來啟動(dòng)和監(jiān)控一個(gè)Python程序的示例代碼。后面將使用subprocess.Popen()
來啟動(dòng)程序,并通過process.poll()
來檢查該進(jìn)程是否仍在運(yùn)行。如果目標(biāo)程序停止運(yùn)行,會獲取其返回碼,并根據(jù)返回碼決定是否重新啟動(dòng)該程序。
具體代碼如下所示:
import os import subprocess import sys import time import psutil # 導(dǎo)入 psutil 模塊 def start_target_program(target_script): # 顯式指定Python解釋器和環(huán)境變量 python_executable = sys.executable env = dict(os.environ) env['PYTHONPATH'] = ":".join(sys.path) # 將當(dāng)前Python解釋器的路徑添加到PYTHONPATH環(huán)境變量中 # 在這里啟動(dòng)你的Python程序 return subprocess.Popen([python_executable, target_script], env=env) def is_program_running(process): # 檢查程序是否在運(yùn)行 return process.poll() is None def bytes_to_readable(size_bytes): # 將字節(jié)數(shù)轉(zhuǎn)換為可讀的格式(KB、MB、GB) for unit in ['', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 def monitor_process(target_script): # 啟動(dòng)被監(jiān)測的程序 target_program = start_target_program(target_script) while True: # 檢查并打印 CPU 利用率 cpu_percent = psutil.cpu_percent(interval=1) print(f"當(dāng)前 CPU 利用率:{cpu_percent}%") # 獲取并打印內(nèi)存信息 memory_info = psutil.virtual_memory() total_memory = bytes_to_readable(memory_info.total) available_memory = bytes_to_readable(memory_info.available) print(f"總內(nèi)存: {total_memory}") print(f"可用內(nèi)存: {available_memory}") # 獲取并打印磁盤分區(qū)信息 disk_partitions = psutil.disk_partitions() print("磁盤分區(qū)信息:") for partition in disk_partitions: print(f" 分區(qū):{partition.device} 掛載點(diǎn):{partition.mountpoint}") # 檢查程序是否在運(yùn)行 if not is_program_running(target_program): # 檢查程序結(jié)束狀態(tài)(是否是正常結(jié)束) if target_program.returncode == 0: print("被監(jiān)測的程序已正常關(guān)閉。") break else: print(f"被監(jiān)測的程序已關(guān)閉,返回代碼:{target_program.returncode}") print("重啟中...") target_program = start_target_program(target_script) else: print("被監(jiān)測的程序正常運(yùn)行...") # 每隔10分鐘監(jiān)聽一次 time.sleep(600) if __name__ == '__main__': # 需要注意被監(jiān)控腳本的路徑和監(jiān)控程序保持在同一目錄下 target_script = input("請輸入你需要監(jiān)控的腳本名稱(xxx.py):") monitor_process(target_script)
通過結(jié)合使用 subprocess 和 psutil 模塊,可以輕松實(shí)現(xiàn)對目標(biāo)程序的監(jiān)控和管理。
本文提供了一個(gè)簡單的示例代碼,展示了如何啟動(dòng)、監(jiān)控和重啟一個(gè)程序。希望這能幫助你更好地理解和使用 Python 進(jìn)行系統(tǒng)和進(jìn)程管理。
總結(jié)
到此這篇關(guān)于Python高級技巧之利用psutil和subprocess實(shí)現(xiàn)程序監(jiān)控與管理的文章就介紹到這了,更多相關(guān)psutil和subprocess程序監(jiān)控與管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV利用手勢識別實(shí)現(xiàn)虛擬拖放效果
這篇文章主要介紹了利用OpenCV實(shí)現(xiàn)手勢識別,從而進(jìn)行虛擬拖放效果,我們可以使用這個(gè)技術(shù)實(shí)現(xiàn)一些游戲,控制機(jī)械臂等很多有趣的事情。感興趣的可以學(xué)習(xí)一下2022-01-01Django上傳xlsx文件直接轉(zhuǎn)化為DataFrame或直接保存的方法
這篇文章主要介紹了Django上傳xlsx文件直接轉(zhuǎn)化為DataFrame或直接保存的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Python實(shí)踐之使用Pandas進(jìn)行數(shù)據(jù)分析
在數(shù)據(jù)分析領(lǐng)域,Python的Pandas庫是一個(gè)非常強(qiáng)大的工具。這篇文章將為大家詳細(xì)介紹如何使用Pandas進(jìn)行數(shù)據(jù)分析,希望對大家有所幫助2023-04-04