Récupérer des infos sur le système
Introduction
La découverte du langage Python est terminée. Déjà dans votre cerveau de nombreuses nouvelles connexions neuronales se sont créées. Mais celles-ci n’ont pas encore un poids suffisant pour produire du code Python sans forcer. Il est nécessaire de passer en phase d’apprentissage et de pratiquer ce langage, et en premier lieu de regarder et comprendre comment font les autres scripteurs Python.
C’est le but de la deuxième partie de cet ouvrage : pratiquer.
Maintenant, il est possible d’utiliser Python et quelques-uns de ses modules pour en faire des outils du quotidien.
Voici ce que nous allons aborder dans cette deuxième partie :
-
Acquérir des informations sur le système
-
Utiliser des formats populaires de fichiers
-
Manipuler des données
-
Générer des rapports et des sites statiques
-
Simuler de l’activité sur une base de données
psutil : récupérer des informations sur le système
Les premières versions du langage Python ont été inspirées par d’autres langages, tels ABC ou Modula-3, mais surtout le langage C et les outils Unix. Python n’a donc jamais été très loin du système d’exploitation ; de plus, il offre toutes les possibilités du langage C et du système d’exploitation Unix, à portée de script.
Mais au fil du temps, Python est devenu un composant essentiel de nombreuses distributions Linux, a été porté et est compilable sur de très nombreux systèmes d’exploitation. Cela a permis la réalisation de librairies multiplateformes comme psutil.
psutil (Python System and process UTILities) permet de récupérer des informations sur l’utilisation du système et sur la gestion des processus en cours d’exécution.
Ce module regroupe les informations initialement données par de nombreuses commandes Unix telles que : ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap.
Multiplateforme, il est utilisable sur les plateformes suivantes : Linux, Windows, MacOS, FreeBSD, OpenBSD, NetBSD, Sun Solaris et AIX.
Ce module est essentiel pour superviser, monitorer ou analyser l’utilisation de vos systèmes....
Des informations sur les composants
Un ordinateur, finalement, n’est pas quelque chose de complexe, il n’y a que 4 composants principaux.
Et le module psutil permet de tous les examiner en détail.
1. Les processeurs
Très simplement, psutil permet d’obtenir des informations sur les processeurs avec les méthodes suivantes :
cpu_times |
Retourne un tuple nommé avec le temps passé en secondes par CPU en mode user / system / idle. Le détail dépend du système. percpu=True permet d’avoir le détail par CPU. |
cpu_percent |
Retourne l’utilisation du CPU en pourcentage. Interval=1 temporise la première utilisation en secondes. percpu=True permet d’avoir le détail par CPU. |
cpu_times_percent |
Retourne les pourcentages de l’utilisation des CPU comme le fait la commande sar -u (%user %system …%iowait …%idle). |
cpu_count |
Retourne le nombre de CPU logiques. Si l’argument logical = False, retourne le nombre de CPU physiques. |
cpu_stats |
Retourne différentes informations comme le nombre de changements de contexte depuis le boot, le nombre d’interruptions... |
cpu_freq |
Retourne la fréquence du/des CPU. percpu=True permet d’avoir le détail par CPU. |
getloadavg |
Retourne la charge du système il y a 1, 5 et 15 minutes. |
Voici un petit exemple pour vérifier si cela se tient avec la commande sar -u :
# fichier : psutil/cpu1.py
import psutil
import datetime
import time
temps = 1
max_temps=5
count=1
while count < max_temps:
print(datetime.datetime.now().time(),
psutil.cpu_times_percent(interval=1))
time.sleep(temps)
count += 1
On met tout cela dans un script shell :
python cpu1.py > cpu1.txt &
sar -u 1 5 >sar.txt &
On le lance et il est ensuite possible de consulter les fichiers.
Le résultat de la commande 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 ...
Capteurs et autres informations
1. Les capteurs
psutil peut fournir des informations sur les capteurs présents sur le serveur ; par contre, il est nécessaire de tester l’existence de chaque capteur avant d’exécuter la méthode.
Parmi les méthodes disponibles se trouvent :
sensors_battery() |
Retourne des informations sur la charge de la batterie. |
sensors_fans() |
Retourne la vitesse des ventilateurs. |
sensors_temperatures() |
Retourne sous forme de tuple les différentes températures matérielles, exprimées en degrés Celsius. farenheit=True fait la même chose en degrés Fahrenheit. |
Voici quelques exemples d’utilisation :
>>> 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)...
Des informations sur les processus
Jusque-là, psutil n’apparaît pas franchement comme l’application tueuse (killer app en anglais) absolument indispensable.
C’est qu’il reste encore une section à étudier : les processus.
Honnêtement, il est difficile de savoir s’il fallait traiter ce sujet en premier ou en dernier. Mais, dans tous les cas, c’est la section importante pour analyser ce qu’il se passe sur les serveurs.
1. Classe Objet et méthodes fournies par psutil
Principalement, psutil vous fournit quelques méthodes pour accéder aux processus, et surtout une classe Process.
Celle-ci contient les données de chaque processus sous forme d’attributs.
Voici la liste des méthodes :
pids |
Retourne la liste des processus en cours du système. |
process_iter |
Retourne un générateur sur les processus du système. attrs : permet de spécifier les attributs de la classe Process que l’on souhaite. ad_value : permet de spécifier une valeur par défaut si la valeur n’est pas accessible, comme avec un problème de droit ACCESS_DENIED. |
pid_exists |
Pour savoir si un processus existe, cette méthode est plus rapide que d’interroger la fonction pids(). |
wait_procs |
Permet d’attendre la fin d’une liste de processus. procs : liste des processus à attendre timeout : temps d’attente callback : appelé chaque fois qu’un des processus se termine |
La classe Process.
Voici ses attributs (enfin presque, voir les explications plus loin) :
Attributs |
Description |
pid |
N° de processus Note : c’est le seul attribut accessible directement. Pour les autres, il faut passer par les fonctions correspondantes. |
ppid |
N° du processus parent |
name |
Nom du processus |
exe |
Chemin absolu de l’exécutable |
username |
Nom de l’utilisateur |
cmdline |
Ligne de commandes sous forme de liste de chaînes de caractères |
connections |
Liste des connexions réseau (tuple nommé). |
cpu_affinity |
Liste les CPU sur lesquels ce processus peut s’exécuter. |
cpu_num |
Le CPU sur lequel le processus s’exécute. |
cpu_percent |
Pourcentage d’utilisation du CPU pour ce processus. |
cpu_times |
Tuple nommé donnant les temps passés dans les différents modes (user, system, iowait... |
Résumé
Comme nous avons l’habitude de le dire, le but n’est pas d’opposer les scripts shell et les scripts Python, mais au contraire d’utiliser les points forts des deux langages.
psutil fait partie de ces modules qui font la différence entre un langage et un autre.
Un peu plus loin se trouve un exemple utilisant le module psutil pour figer dans une base de données les informations à un instant donné.
Cela permet d’analyser l’état d’un serveur à tête reposée.