Python如何精準(zhǔn)判斷某個進(jìn)程是否在運(yùn)行
一、為什么需要判斷進(jìn)程是否存在
想象這個場景:你寫了一個自動化腳本,需要先檢查某個后臺服務(wù)是否已經(jīng)啟動。如果直接運(yùn)行你的程序,而依賴的服務(wù)沒啟動,整個系統(tǒng)就可能崩潰。這時候,用Python自動檢測進(jìn)程是否存在就成了關(guān)鍵能力!
比如:
- 監(jiān)控服務(wù)器上的MySQL是否意外崩潰
- 確保爬蟲程序沒有重復(fù)啟動
- 檢查殺毒軟件是否正常運(yùn)行
這些需求都需要一個可靠的方法來判斷進(jìn)程狀態(tài)。下面我們就用Python實(shí)現(xiàn)這個功能!
二、方法1:用psutil庫(推薦)
psutil是Python最強(qiáng)的系統(tǒng)監(jiān)控庫之一,跨平臺支持Windows/Linux/Mac。安裝它:
pip install psutil
檢查Chrome是否運(yùn)行的代碼:
import psutil
def is_process_running(process_name):
for proc in psutil.process_iter(['name']):
if proc.info['name'] == process_name:
return True
return False
if is_process_running('chrome.exe'):
print("Chrome正在運(yùn)行!")
else:
print("Chrome未運(yùn)行")
優(yōu)點(diǎn):
- 代碼簡潔
- 支持模糊匹配(比如只輸入"chrome")
- 能獲取進(jìn)程詳細(xì)信息(CPU、內(nèi)存等)
實(shí)測數(shù)據(jù):
在測試機(jī)上掃描1000個進(jìn)程只需0.02秒!
三、方法2:用os.system調(diào)用系統(tǒng)命令
不同操作系統(tǒng)要用不同命令:
Windows系統(tǒng):
import os
def check_process_win(process_name):
return os.system(f'tasklist | find "{process_name}"') == 0
print("Notepad運(yùn)行中" if check_process_win('notepad.exe') else "未找到記事本")
Linux/Mac系統(tǒng):
def check_process_linux(process_name):
return os.system(f'pgrep -f "{process_name}"') == 0
缺點(diǎn):
- 依賴系統(tǒng)命令
- 不同平臺要寫不同代碼
- 性能較差(每次都要啟動新進(jìn)程)
四、方法3:用subprocess獲取詳細(xì)進(jìn)程信息
想要更靈活地處理進(jìn)程信息?可以用subprocess模塊:
import subprocess
def get_process_details(name):
try:
output = subprocess.check_output(['ps', '-aux']).decode()
return [line for line in output.split('\n') if name in line]
except:
return []
chrome_processes = get_process_details('chrome')
print(f"找到{len(chrome_processes)}個Chrome進(jìn)程")
適用場景:
- 需要獲取進(jìn)程的完整命令行參數(shù)
- 要分析進(jìn)程的資源占用情況
五、性能對比測試
我們在同一臺機(jī)器上測試3種方法(檢測chrome.exe):
| 方法 | 耗時(秒) | 跨平臺 | 信息詳細(xì)度 |
|---|---|---|---|
| psutil | 0.02 | ? | ★★★★★ |
| os.system | 0.15 | ? | ★★☆☆☆ |
| subprocess | 0.12 | ? | ★★★★☆ |
顯然,psutil是綜合最優(yōu)解!它不僅快,還能獲取進(jìn)程的CPU、內(nèi)存等詳細(xì)信息。如果你經(jīng)常需要做系統(tǒng)監(jiān)控,這個庫絕對要掌握。
六、實(shí)際應(yīng)用案例
案例1:防止腳本重復(fù)運(yùn)行
import psutil
import sys
current_pid = os.getpid()
for proc in psutil.process_iter(['pid', 'name']):
if proc.info['name'] == 'python.exe' and proc.info['pid'] != current_pid:
print("已有Python進(jìn)程在運(yùn)行!")
sys.exit()
案例2:監(jiān)控服務(wù)自動重啟
import time
while True:
if not is_process_running('nginx.exe'):
os.system('start nginx') # Windows啟動命令
print("檢測到Nginx崩潰,已重啟!")
time.sleep(60) # 每分鐘檢查一次
七、常見問題解答
Q:為什么找不到剛啟動的進(jìn)程?
A:進(jìn)程可能需要幾毫秒才能注冊到系統(tǒng),建議檢測時加短暫延遲。
Q:如何匹配帶參數(shù)的進(jìn)程?
# 用psutil的cmdline屬性 [p.cmdline() for p in psutil.process_iter() if 'python' in p.name()]
Q:檢測到進(jìn)程后能做什么?
- 結(jié)束進(jìn)程:process.terminate()
- 獲取資源占用:process.cpu_percent()
- 分析子進(jìn)程:process.children()
八、完整代碼模板
import psutil
class ProcessMonitor:
@staticmethod
def is_running(name):
"""檢查進(jìn)程是否存在"""
return name in (p.name() for p in psutil.process_iter(['name']))
@staticmethod
def kill_process(name):
"""結(jié)束指定進(jìn)程"""
for proc in psutil.process_iter(['name']):
if proc.info['name'] == name:
proc.kill()
return True
return False
???????# 使用示例
if ProcessMonitor.is_running('notepad.exe'):
print("發(fā)現(xiàn)記事本進(jìn)程")
ProcessMonitor.kill_process('notepad.exe')九、總結(jié)
判斷進(jìn)程是否存在看似簡單,但實(shí)際要考慮:
- 跨平臺兼容性:Windows和Linux命令完全不同
- 性能要求:頻繁檢測時需要高效方法
- 擴(kuò)展需求:是否要獲取進(jìn)程詳細(xì)信息
推薦選擇:
- 一般情況用psutil(簡單可靠)
- 特殊需求用subprocess(靈活控制)
- 臨時測試用os.system(快速驗(yàn)證)
到此這篇關(guān)于Python如何精準(zhǔn)判斷某個進(jìn)程是否在運(yùn)行的文章就介紹到這了,更多相關(guān)Python判斷進(jìn)程是否運(yùn)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?DataFrame中l(wèi)oc與iloc取數(shù)據(jù)的基本方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python?DataFrame中l(wèi)oc與iloc取數(shù)據(jù)的基本方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02
如何利用pandas將Excel轉(zhuǎn)為html格式
工作中經(jīng)常會遇到Excel轉(zhuǎn)為html格式這種需求,下面這篇文章主要給大家介紹了關(guān)于如何利用pandas將Excel轉(zhuǎn)為html格式的相關(guān)資料,主要利用的是pd.to_html,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08
通過Python模塊filecmp 對文件比較的實(shí)現(xiàn)方法
這篇文章主要介紹了通過Python模塊filecmp 對文件比較的實(shí)現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
python如何在pygame中設(shè)置字體并顯示中文詳解
再簡單的游戲界面中均涉及文字處理,下面這篇文章主要給大家介紹了關(guān)于python如何在pygame中設(shè)置字體并顯示中文的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
解析Mac OS下部署Pyhton的Django框架項(xiàng)目的過程
這篇文章主要介紹了Mac OS下部署Pyhton的Django框架項(xiàng)目的過程,還附帶將了一個gunicorn結(jié)合Nginx來部署Django應(yīng)用的方法,需要的朋友可以參考下2016-05-05

