vendredi 11 mars 2011

Monitorer des processus à l'aide de Python

Introduction
Faisant suite à l'article sur psutil (psutil: la bibliothèque Python pour monitorer les processus), voici les sources du code ProcessStat permettant de faire le suivit graphique de différentes caractéristiques de processus.
Ce projet est développé en s'inspirant de l'article "Charge et Processus: Gardez votre système à l'oeil!" de Frederic Le Roy paru dans Gnu Linux Magazine No 134.

Description
ProcessStat.py permet de faire le suivit graphique de différentes caractéristiques d'un ou plusieurs processus telles que cpu_percent, memory_percent, memory_rss(resident size set), memory_vms (virtual memory) ainsi que l'évolution de la mémoire global (total_physical_memory).
ProcessStat.py prend un ou plusieurs PID en argument de ligne de commande (sans préfixe) et génère ensuite des graphiques d'utilisation toute les 10 secondes dans le répertoire /tmp/.

Voici un exemple d'output du script.

Located pid 3996 having process name gnome-terminal
file saved: 16:08:59 - /tmp/chart-3996-memory_vms.png
file saved: 16:08:59 - /tmp/chart-3996-memory_percent.png
file saved: 16:08:59 - /tmp/chart-3996-memory_rss.png
file saved: 16:08:59 - /tmp/chart-3996-total_physical_memory.png
file saved: 16:08:59 - /tmp/chart-3996-cpu_percent.png
file saved: 16:09:10 - /tmp/chart-3996-memory_vms.png
file saved: 16:09:10 - /tmp/chart-3996-memory_percent.png


Et voici les différents fichiers générés (capture des fichiers visibles dans le répertoire /tmp à l'aide de l'explorateur de fichiers).
Liste des fichiers générés par ProcessStat.py

Installation
Pour fonctionner correctement, il faut installer les modules python psutil et mapplotlib.
MatPlotLib require de nombreuses dépendances, sa compilation et son installation ne sont franchement pas évidents. Il est préférable d'opter pour le package python-matplotlib déjà tout prêt.

sudo pip install psutil
sudo apt-get install python-matplotlib

Exécution directe
Il est possible de rendre ProcessStat exécutable en ligne de commande en utilisant la commande

chmod +x ProcessStat.py

Il est ensuite possible de suivre les processus à l'aide d'une commande telle que "./ProcessStat.py 1897 1706" où 1897 et 1706 sont des PID de processus que j'ai localisé à l'aide de la commande "ps -ef" (par exemple).
./ProcessStat.py 1897 1706
L'exécution directe est rendue possible à l'aide de deux petits bouts de code se trouvant de ProcessStat.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
...
if __name__ == "__main__":
    myStats = ProcessStat( sys.argv[1:], 5)

Bogue connue
Le processus de ProcessStat peut être interrompu à l'aide de la combinaison de touche ctrl+c.
Cependant, le processus de capture ne s'arrête pas toujours.
En effet, dans la version actuelle du logiciel, la demande d'arrêt du processus n'est pas interceptée et il n'est donc pas possible d'arrêter les threads de captures d'information (thread sur ProcessInfo) par conséquent, le processus ProcessStat ne prend pas fin.
Par contre, les threads ProcessInfo prennent fin automatiquement lorsque les processus monitorés sont eux terminés. Seulement alors, le processus principal pourra prendre fin "gracefully".


Code source
Source: ProcessStat.zip
L'archive contient les fichiers suivants:
Main.py
Fichier inutile en temps normal, je l'ai utilisé pour tester ProcessInfo et ProcessStat durant leurs développements sous Eclipse.
Par défaut, Main.py essaye de monitorer un terminal gnome.
ProcessInfo.py
Classe qui collecte les informations de statistique pour un processus donnée. ProcessInfo rappelle une fonction de callback à intervale régulier avec un dictionnaire de valeurs en paramètre.
Ce fichier contient également quelques fonctions utilitaires tel que get_pid_from_ExactName, get_ProcessInfo_from_ExactName, get_ProcessInfo_from_PartialName.
ProcessStat.py
Lance un thread par ProcessID pour la collecte d'information (sur ProcessInfo.start), enmagasine les informations fournies par le callback de ProcessInfo et dessine différents graphiques à interval régulier dans le répertoire temporaire.
ProcessStat est capable de suivre plusieurs ProcessID.

Ressources

Aucun commentaire: