Blog ENI : Toute la veille numérique !
🎁 Jusqu'au 25/12 : 1 commande de contenus en ligne
= 1 chance de gagner un cadeau*. Cliquez ici
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici
  1. Livres et vidéos
  2. Scripting Python sous Linux
  3. Récupérer des infos sur le système
Extrait - Scripting Python sous Linux Développez vos outils système (2e édition)
Extraits du livre
Scripting Python sous Linux Développez vos outils système (2e édition)
3 avis
Revenir à la page d'achat du livre

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, tasksetpmap.

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.