最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python高級(jí)技巧之利用psutil和subprocess實(shí)現(xiàn)程序監(jiān)控與管理

 更新時(shí)間:2024年09月26日 09:19:49   作者:散一世繁華,顛半世琉璃  
本文介紹了如何使用Python的psutil和subprocess模塊監(jiān)控程序運(yùn)行狀態(tài),并提供了一個(gè)案例腳本,用于監(jiān)控目標(biāo)程序并在停止時(shí)自動(dòng)重啟,詳細(xì)介紹了subprocess模塊的基本用法和psutil模塊的系統(tǒng)信息獲取、進(jìn)程管理及資源監(jiān)控功能,需要的朋友可以參考下

1.簡(jiǎn)介

在關(guān)鍵的應(yīng)用程序中,監(jiān)聽(tīng)程序的運(yùn)行狀態(tài)十分重要,因?yàn)槠淇梢源_保程序的平穩(wěn)運(yùn)行。本文將介紹如何使用Python實(shí)現(xiàn)這一功能,這里主要使用psutilsubprocess模塊。同時(shí),最后會(huì)提供一個(gè)完整的腳本案例供參考,用于監(jiān)控并在目標(biāo)程序意外停止時(shí)重啟程序。

2.subprocess模塊介紹

subprocess 模塊是 Python 中用于創(chuàng)建和管理子進(jìn)程的標(biāo)準(zhǔn)庫(kù)模塊。它允許你執(zhí)行系統(tǒng)命令其他可執(zhí)行文件,獲取它們的輸出,以及與其交互。下面是一些 subprocess 模塊的基本用法和示例:

1. 運(yùn)行外部命令

你可以使用 subprocess.run() 函數(shù)來(lái)運(yùn)行外部命令,并等待其完成:

import subprocess

# 運(yùn)行一個(gè)簡(jiǎn)單的命令
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. 后臺(tái)執(zhí)行命令

如果你希望命令在后臺(tái)執(zhí)行而不阻塞當(dāng)前進(jìn)程,可以使用 subprocess.Popen 類:

import subprocess

# 后臺(tái)執(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() 方法來(lái)實(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. 處理命令返回值

通過(guò) subprocess.run() 或 subprocess.Popen.wait() 可以獲取命令的返回值,通常是命令的退出代碼。這可以幫助你判斷命令是否成功執(zhí)行。

3.psutil模塊介紹

psutil(Python System and Process Utilities)模塊是一個(gè)跨平臺(tái)的庫(kù),提供了方便的接口來(lái)獲取系統(tǒng)信息和管理進(jìn)程。它可以用于監(jiān)控系統(tǒng)資源的使用情況、管理進(jìn)程以及執(zhí)行系統(tǒng)管理任務(wù)。以下是 psutil 模塊的一些主要功能和使用示例:

1. 安裝 psutil

首先確保你已經(jīng)安裝了 psutil 模塊。如果沒(méi)有安裝,可以通過(guò) pip 安裝:

pip install psutil

2. 獲取系統(tǒng)信息

使用 psutil 可以輕松地獲取系統(tǒng)的各種信息,如 CPU 使用率、內(nèi)存使用情況、磁盤(pán)分區(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")

# 獲取磁盤(pán)分區(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 可以用來(lái)獲取系統(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} 對(duì)應(yīng)的進(jìn)程不存在。")

4. 進(jìn)程管理操作

psutil 還允許對(duì)進(jìn)程進(jìn)行管理操作,如終止進(jìn)程、發(fā)送信號(hào)等。

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} 對(duì)應(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 的其他功能來(lái)實(shí)現(xiàn)更復(fù)雜的系統(tǒng)管理和監(jiān)控任務(wù)。

4.實(shí)戰(zhàn)應(yīng)用

下面是一個(gè)使用subprocess模塊來(lái)啟動(dòng)和監(jiān)控一個(gè)Python程序的示例代碼。后面將使用subprocess.Popen()來(lái)啟動(dòng)程序,并通過(guò)process.poll()來(lái)檢查該進(jìn)程是否仍在運(yùn)行。如果目標(biāo)程序停止運(yùn)行,會(huì)獲取其返回碼,并根據(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)測(cè)的程序
    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}")

        # 獲取并打印磁盤(pán)分區(qū)信息
        disk_partitions = psutil.disk_partitions()
        print("磁盤(pán)分區(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)測(cè)的程序已正常關(guān)閉。")
                break
            else:
                print(f"被監(jiān)測(cè)的程序已關(guān)閉,返回代碼:{target_program.returncode}")
                print("重啟中...")
                target_program = start_target_program(target_script)
        else:
            print("被監(jiān)測(cè)的程序正常運(yùn)行...")

        # 每隔10分鐘監(jiān)聽(tīng)一次
        time.sleep(600)

if __name__ == '__main__':
    # 需要注意被監(jiān)控腳本的路徑和監(jiān)控程序保持在同一目錄下
    target_script = input("請(qǐng)輸入你需要監(jiān)控的腳本名稱(xxx.py):")
    monitor_process(target_script)

通過(guò)結(jié)合使用 subprocess 和 psutil 模塊,可以輕松實(shí)現(xiàn)對(duì)目標(biāo)程序的監(jiān)控和管理。

本文提供了一個(gè)簡(jiǎn)單的示例代碼,展示了如何啟動(dòng)、監(jiān)控和重啟一個(gè)程序。希望這能幫助你更好地理解和使用 Python 進(jìn)行系統(tǒng)和進(jìn)程管理。

總結(jié)

到此這篇關(guān)于Python高級(jí)技巧之利用psutil和subprocess實(shí)現(xiàn)程序監(jiān)控與管理的文章就介紹到這了,更多相關(guān)psutil和subprocess程序監(jiān)控與管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)域名系統(tǒng)(DNS)正向查詢的方法

    python實(shí)現(xiàn)域名系統(tǒng)(DNS)正向查詢的方法

    這篇文章主要介紹了python實(shí)現(xiàn)域名系統(tǒng)(DNS)正向查詢的方法,結(jié)合實(shí)例形式分析了Python使用socket模塊下getaddrinfo方法進(jìn)行域名查詢的具體技巧,需要的朋友可以參考下
    2016-04-04
  • python list轉(zhuǎn)dict示例分享

    python list轉(zhuǎn)dict示例分享

    這篇文章主要介紹了python list轉(zhuǎn)dict的使用方法,大家參考使用吧
    2014-01-01
  • Python內(nèi)置函數(shù)delattr的具體用法

    Python內(nèi)置函數(shù)delattr的具體用法

    本篇文章主要介紹了Python內(nèi)置函數(shù)delattr的具體用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • python 實(shí)現(xiàn)rolling和apply函數(shù)的向下取值操作

    python 實(shí)現(xiàn)rolling和apply函數(shù)的向下取值操作

    這篇文章主要介紹了python 實(shí)現(xiàn)rolling和apply函數(shù)的向下取值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 淺談python類屬性的訪問(wèn)、設(shè)置和刪除方法

    淺談python類屬性的訪問(wèn)、設(shè)置和刪除方法

    下面小編就為大家?guī)?lái)一篇淺談python類屬性的訪問(wèn)、設(shè)置和刪除方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • Python Dataframe常見(jiàn)索引方式詳解

    Python Dataframe常見(jiàn)索引方式詳解

    這篇文章主要介紹了Python Dataframe常見(jiàn)索引方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境

    在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境

    這篇文章主要介紹了在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境的方法,使用到了mod_python 與mysqldb模塊進(jìn)行連接,需要的朋友可以參考下
    2015-12-12
  • Python處理表格dataframe時(shí)實(shí)現(xiàn)行轉(zhuǎn)列和列轉(zhuǎn)行的方法

    Python處理表格dataframe時(shí)實(shí)現(xiàn)行轉(zhuǎn)列和列轉(zhuǎn)行的方法

    在python中,我們可以使用pandas庫(kù)來(lái)處理表格數(shù)據(jù),而pandas庫(kù)中的核心數(shù)據(jù)類型就是DataFrame,在處理DataFrame數(shù)據(jù)時(shí),有時(shí)候需要將行轉(zhuǎn)換為列,或者將列轉(zhuǎn)換為行,所以本文給大家介紹了如何使用pandas庫(kù)實(shí)現(xiàn)行轉(zhuǎn)列和列轉(zhuǎn)行,需要的朋友可以參考下
    2025-12-12
  • Python入門(mén)之pip永久鏡像源的配置方法

    Python入門(mén)之pip永久鏡像源的配置方法

    這篇文章主要為大家詳細(xì)介紹了國(guó)內(nèi)幾個(gè)好用的Python鏡像服務(wù)器地址,如清華,阿里云等,還說(shuō)明了臨時(shí)和永久鏡像源的配置方法,希望對(duì)大家有一定的幫助
    2025-05-05
  • Pycharm安裝第三方庫(kù)的超詳細(xì)步驟

    Pycharm安裝第三方庫(kù)的超詳細(xì)步驟

    使用python時(shí),為了提高效率,安裝添加第三方庫(kù)是必不可少的,下面這篇文章主要給大家介紹了關(guān)于Pycharm安裝第三方庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

区。| 定结县| 乾安县| 云南省| 兴文县| 民乐县| 嘉义市| 乐陵市| 青川县| 乐安县| 化州市| 潍坊市| 高平市| 屏边| 开江县| 邵武市| 鱼台县| 灵川县| 宝鸡市| 福州市| 右玉县| 澳门| 云龙县| 松江区| 永城市| 正蓝旗| 秀山| 罗甸县| 宜兰市| 朝阳县| 康乐县| 读书| 皋兰县| 丰城市| 武隆县| 修水县| 增城市| 简阳市| 眉山市| 云南省| 贺州市|