28/08/2010

Having fun with dot

Présentation

GraphViz est une application permettant de représenter graphiquement des graphes. Elle a été conçu par une équipe des laboratoires de recherches de AT&T. Elle est entièrement paramétrable, personalisation des formes, couleurs, polices de caractères ... Elle suppporte aussi beaucoup de formats de sortie : gif, jpg, png ... Afin d'en montrer la puissance et la simplicité du format en entrée : fichier .dot, je me suis amusé à écrire un script bash qui crée un graph de toute la hiérarchie des processus à l'aide de la commande ps. Ici j'utilise le générateur Dot qui je pense est le plus approprié pour le résultat souhaité.

Code

#!/bin/sh

if [ $# -ne 1 ]
then
  echo "Usage : $0 <type>"
else
  if [ $1 != "PID" ] && [ $1 != "NAME" ] && [ $1 != "PID_NAME" ]
  then
    echo "type : - PID = Create graph with the pid of the different process"
    echo "       - NAME = Create graph with the name of the different process"
    echo "       - PID_NAME = Create graph with the name & pid of the different process" 
  else
    if test -f ps_graph.dot
    then
      rm ps_graph.dot
    fi
    echo "digraph G{node [color=lightblue1, style=filled];" > ps_graph.dot
    ps -axo pid,ppid,command | tail -n +2| while read ligne;
    do
    PID=`echo $ligne | cut -d " " -f1`
    PPID=`echo $ligne | cut -d " " -f2`
    if [ $1 = "PID" ]
    then
      out="${PPID} -> ${PID};"
    else
      NAME=`echo $ligne | cut -d " " -f3`
      OLDNAME=`ps -p $PPID -o command | tail -n +2 | cut -d " " -f1`
      if [ $1 = "NAME" ]
      then
      out="\"${OLDNAME}\" -> \"${NAME}\";"
      else
      out="\"$PPID::${OLDNAME}\" -> \"$PID::${NAME}\";"
      fi
    fi
    echo $out >> ps_graph.dot
    done
    echo "}" >> ps_graph.dot
    dot ps_graph.dot -Tpng -o ps_graph.png
  fi
fi

Résultat

ps_graph

Voir l'image en grand.