¿Cómo hacer un monitor de procesos en Python?

Un monitor de procesos es una herramienta que muestra la información del sistema, como procesos, memoria, red y otras cosas. Hay muchas herramientas disponibles, pero podemos hacer nuestro propio monitor de procesos usando Python. En Python, hay un módulo llamado psutil que podemos usar para obtener información diversa sobre nuestro sistema.

Módulos necesarios

  • psutil : escriba el siguiente comando en la terminal para instalar este módulo.
python3 -m pip install psutil 
  • Prettytable: para imprimir los datos en la consola, podemos usar un módulo formateador PrettyTable :
python3 -m pip install prettytable

Usando psutil

psutil proporciona muchas funciones para monitorear el sistema. Veamos algunos de ellos brevemente:

  • Primero, necesitamos importar psutil:
import psutil
  • Enumere los identificadores de proceso:
psutil.pids()  # [1,2,.....4352]
  • Obtener información del proceso:
process_id = 1
psutil.Process(process_id)  
# psutil.Process(pid=1, name='systemd', status='sleeping', started='19:49:25')
  • Podemos acceder a varias claves de este proceso:
process = psutil.Process(process_id)
process.name()
process.status()
  • Acceso al estado de la batería:
psutil.sensors_battery()    
psutil.sensors_battery().percent
  • Acceso a las interfaces de red:
psutil.net_if_stats()  
psutil.net_if_stats()['wlo1'].isup    # True
  • También podemos comprobar la memoria:
psutil.virtual_memory()
psutil.virtual_memory().total    # 8180498432 (In Bytes)
psutil.virtual_memory().used    # 2155720704
psutil.virtual_memory().available   # 5563060224

Ahora que conocemos algunas características básicas, podemos implementar el monitor de procesos. Cree un nuevo archivo python y agregue el siguiente código en él. El siguiente código funciona en distribuciones de Linux. Para otros sistemas operativos, algunas funciones pueden diferir ligeramente.

Acercarse:

  • Importe los paquetes necesarios.
  • Borre la consola usando la función call() del módulo de subproceso. Podemos usar el comando ‘clear’ o ‘cls’ según el sistema operativo.
  • Obtener la información de la batería
  • Obtenga la información de la red e imprímala como PrettyTable
  • Obtener la información de la memoria
  • Obtener la información del proceso
  • Crea un retraso. Hemos creado un retraso de 1 segundo usando time.sleep(1)
  • Presione CTRL+C para detener el programa.

A continuación se muestra la implementación:

Python3

# Import the required libraries
import psutil
import time
from subprocess import call
from prettytable import PrettyTable
 
# Run an infinite loop to constantly monitor the system
while True:
 
    # Clear the screen using a bash command
    call('clear')
 
    print("==============================Process Monitor\
    ======================================")
 
    # Fetch the battery information
    battery = psutil.sensors_battery().percent
    print("----Battery Available: %d " % (battery,) + "%")
 
    # We have used PrettyTable to print the data on console.
    # t = PrettyTable(<list of headings>)
    # t.add_row(<list of cells in row>)
 
    # Fetch the Network information
    print("----Networks----")
    table = PrettyTable(['Network', 'Status', 'Speed'])
    for key in psutil.net_if_stats().keys():
        name = key
        up = "Up" if psutil.net_if_stats()[key].isup else "Down"
        speed = psutil.net_if_stats()[key].speed
        table.add_row([name, up, speed])
    print(table)
 
    # Fetch the memory information
    print("----Memory----")
    memory_table = PrettyTable(["Total(GB)", "Used(GB)",
                                "Available(GB)", "Percentage"])
    vm = psutil.virtual_memory()
    memory_table.add_row([
        f'{vm.total / 1e9:.3f}',
        f'{vm.used / 1e9:.3f}',
        f'{vm.available / 1e9:.3f}',
        vm.percent
    ])
    print(memory_table)
 
    # Fetch the 10 processes from available processes that has the highest cpu usage
    print("----Processes----")
    process_table = PrettyTable(['PID', 'PNAME', 'STATUS',
                                 'CPU', 'NUM THREADS', 'MEMORY(MB)'])
 
    proc = []
    # get the pids from last which mostly are user processes
    for pid in psutil.pids()[-200:]:
        try:
            p = psutil.Process(pid)
            # trigger cpu_percent() the first time which leads to return of 0.0
            p.cpu_percent()
            proc.append(p)
 
        except Exception as e:
            pass
 
    # sort by cpu_percent
    top = {}
    time.sleep(0.1)
    for p in proc:
        # trigger cpu_percent() the second time for masurement
        top[p] = p.cpu_percent() / psutil.cpu_count()
 
    top_list = sorted(top.items(), key=lambda x: x[1])
    top10 = top_list[-10:]
    top10.reverse()
 
    for p, cpu_percent in top10:
 
        # While fetching the processes, some of the subprocesses may exit
        # Hence we need to put this code in try-except block
        try:
            # oneshot to improve info retrieve efficiency
            with p.oneshot():
                process_table.add_row([
                    str(p.pid),
                    p.name(),
                    p.status(),
                    f'{cpu_percent:.2f}' + "%",
                    p.num_threads(),
                    f'{p.memory_info().rss / 1e6:.3f}'
                ])
 
        except Exception as e:
            pass
    print(process_table)
 
    # Create a 1 second delay
    time.sleep(1)

Producción:

 

Publicación traducida automáticamente

Artículo escrito por mukulbindal170299 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *