Recuperar información del sistema
Introducción
El descubrimiento del lenguaje Python ha terminado. En su cerebro ya se han creado muchas conexiones neuronales nuevas. Pero estas todavía no tienen el peso suficiente para producir código Python sin forzar. Es necesario entrar en la fase de aprendizaje y practicar este lenguaje y, en primer lugar, ver y entender cómo lo hacen otros programadores de Python.
Este es el objetivo de la segunda parte de este libro: practicar.
Ahora es posible utilizar Python y algunos de sus módulos para convertirlos en herramientas cotidianas.
Esto es lo que cubriremos en esta segunda parte:
-
Adquirir información sobre el sistema
-
Utilizar formatos de archivo populares
-
Manipular datos
-
Generar informes y sitios estáticos.
-
Simular actividad en una base de datos
psutil: recuperar información del sistema
Las primeras versiones del lenguaje Python se inspiraron en otros lenguajes, como ABC o Modula-3, pero especialmente en el lenguaje C y las herramientas Unix. Por tanto, Python nunca ha estado muy lejos del sistema operativo; además, ofrece todas las posibilidades del lenguaje C y del sistema operativo Unix, al alcance de los scripts.
Pero con el tiempo, Python se ha convertido en un componente esencial de muchas distribuciones de Linux. Se ha adaptado y se puede compilar en muchos sistemas operativos. Esto permitió la realización de librerías multiplataforma como psutil.
psutil (Python System and process UTILities), permite recuperar información sobre el uso del sistema y sobre la gestión de los procesos en ejecución.
Este módulo agrupa la información proporcionada inicialmente por muchos comandos de Unix como: ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap.
Multiplataforma, se puede utilizar en las siguientes plataformas: Linux, Windows, MacOS, FreeBSD, OpenBSD, NetBSD, Sun Solaris y AIX.
Este módulo es fundamental para supervisar, monitorizar o analizar el uso de sus sistemas. Permite recuperar información sobre los procesadores, la memoria, los discos, las interfaces de red, los diversos sensores presentes y especialmente, sobre los procesos en ejecución.
psutil permitió...
Información de los componentes
Un ordenador, finalmente no es algo complejo. Solo hay 4 componentes principales.
Y el módulo psutil le permite examinarlos todos en detalle.
1. Los procesadores
De manera muy simple, psutil permite obtener información sobre procesadores con los siguientes métodos:
cpu_times |
Devuelve una tupla nombrada con el tiempo en segundos que pasa la CPU en modo usuario/sistema/inactivo. El detalle depende del sistema. percpu=True permite tener el detalle por CPU. |
cpu_percent |
Devuelve el uso de la CPU como porcentaje. Interval=1 retrasa el primer uso en segundos. percpu=True permite tener el detalle por CPU. |
cpu_times_percent |
Devuelve los porcentajes de uso de la CPU como lo hace el comando sar -u (% user% system…% iowait…% idle). |
cpu_count |
Devuelve el número de CPU lógicas. Si el argumento logical=False, devuelve el número de CPU físicas. |
cpu_stats |
Devuelve información diversa, como el número de cambios de contexto desde el inicio, el número de interrupciones, etc. |
cpu_freq |
Devuelve la frecuencia de la(s) CPU. percpu=True permite tener el detalle por CPU. |
getloadavg |
Devuelve la carga del sistema de los últimos 1, 5 y 15 minutes. |
Aquí hay un pequeño ejemplo para verificar si esto se mantiene con el comando sar -u:
# archivo: psutil/cpu1.py
import psutil
import datetime
import time
tiempo = 1
max_tiempo=5
count=1
while count < max_tiempo:
print(datetime.datetime.now().time(),
psutil.cpu_times_percent(interval=1))
time.sleep(tiempo)
count += 1
Metemos todo esto en un script shell:
python cpu1.py > cpu1.txt &
sar -u 1 5 >sar.txt &
Lo lanzamos y a continuación es posible consultar los archivos.
El resultado del comando sar:
Linux 4.4.0-170-generic (W550-BR-007) 04/01/2020 _x86_64_ (4 CPU)
11:51:38 CPU %user %nice %system %iowait %steal %idle
11:51:39 all 3,99 0,00 0,50...
Sensores y otra información
1. Los sensores
psutil puede proporcionar información sobre los sensores presentes en el servidor; por otro lado, es necesario probar la existencia de cada sensor antes de ejecutar el método.
Entre los métodos disponibles se encuentran:
sensors_battery() |
Devuelve información sobre la carga de la batería. |
sensors_fans() |
Devuelve la velocidad de los ventiladores. |
sensors_temperatures() |
Devuelve las diferentes temperaturas del hardware, expresadas en grados Celsius, como una tupla. farenheit = True hace lo mismo en grados Fahrenheit. |
A continuación se muestran algunos ejemplos de uso:
>>> psutil.sensors_fans()
{'thinkpad': [sfan(label='', current=2272)]}
>>> psutil.sensors_battery()
sbattery(percent=48.698884758364315, secsleft=
<BatteryTime.POWER_TIME_UNLIMITED: -2>, power_plugged=True)
>>> psutil.sensors_temperatures()
{'acpitz': [shwtemp(label='', current=49.0, high=103.0,
critical=103.0)], 'pch_wildcat_point': [shwtemp(label='',
current=48.0, high=None, critical=None)], 'coretemp':
[shwtemp(label='Physical id 0', current=49.0, high=105.0,
critical=105.0), shwtemp(label='Core 0', current=49.0, high=105.0,
critical=105.0)...
Información de los procesos
Hasta ahora, psutil no parece ser la aplicación asesina (killer app en inglés) absolutamente esencial.
Esto se debe a que todavía queda un apartado por estudiar: los procesos.
Honestamente, es difícil saber si tratar este tema en primer lugar o al final. Pero, en cualquier caso, esta es una sección importante para analizar qué está pasando en los servidores.
1. Clase Objeto y métodos proporcionados por psutil
Principalmente, psutil le proporciona algunos métodos para acceder a los procesos y, lo más importante, una clase Process.
La clase contiene los datos de cada proceso en forma de atributos.
A continuación se muestra la lista de los métodos:
pids |
Devuelve la lista de los procesos actuales del sistema. |
process_iter |
Devuelve un generador sobre los procesos del sistema. attrs: permite especificar los atributos de la clase de Process que desee. ad_value: permite especificar un valor predeterminado si el valor no es accesible, como con un problema de permisos ACCESS_DENIED. |
pid_exists |
Para saber si existe un proceso, este método es más rápido que consultar la función pids(). |
wait_procs |
Le permite esperar al final de una lista de procesos. procs: lista de procesos a esperar timeout: tiempo de espera callback: se llama cada vez que finaliza uno de los procesos |
La clase Process.
A continuación se muestran sus atributos (bueno casi, vea las explicaciones a continuación):
Atributos |
Descripción |
pid |
Número de proceso Nota: este es el único atributo directamente accesible. Para los demás, hay que pasar por las funciones correspondientes. |
ppid |
Número de proceso principal |
name |
Nombre del proceso |
exe |
Ruta absoluta al ejecutable |
username |
Nombre de usuario |
cmdline |
Línea de comando bajo la forma de lista de cadenas de caracteres |
connections |
Lista de las conexiones de red (tupla nombrada). |
cpu_affinity |
Enumera las CPU en las que se puede ejecutar este proceso. |
cpu_num |
La CPU en la que se está ejecutando el proceso. |
cpu_percent |
Porcentaje de uso de CPU para este proceso. |
cpu_times |
Tupla con nombre que indica los tiempos que han pasado en los diferentes modos (user, system, iowait, children, etc). |
create_time |
Fecha de creación en formato epoch. |
cwd |
Directorio de trabajo. |
environ |
Variables de entorno en forma de diccionario. |
gids |
Grupos reales, efectivos... |
Resumen
Como estamos acostumbrados a decir, el objetivo no es enfrentar los scripts de shell y los scripts de Python, sino más bien utilizar las fortalezas de ambos lenguajes.
psutil es uno de esos módulos que marcan la diferencia entre un lenguaje y otro.
Un poco más adelante se muestra un ejemplo usando el módulo psutil para congelar la información de una base de datos en un momento dado.
Esto le permite analizar el estado de un servidor con la mente despejada.