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