Pages : 1
#1 Le 29/09/2008, à 15:42
- gilthar
Script : pstree en korn shell.
Bonjour,
Travaillant sous AIX, je scripte un pstree car il n'est pas disponible sous AIX.
Cela permet d'afficher la hiérarchie des processus avec comme argument le numéro de process.
Par exemple :
$ptree 12300
1200
12300
14000
153434
15000
243345
355345
Dans le cadre de mon script, j'utilise en ps avec un filtre en awk qui me donne le résultat de ce type :
$cat sortie
PID PPID
100 1
200 100
101 1
102 1
201 100
202 101
302 200
303 202
403 303
404 303
103 1
204 101
304 202
Obtenir la liste des processus père est relativement facile.
Par contre, j'ai quelques difficultés pour obtenir, pour chaque process père, les pid des fils.
J'ai choisi d'appeler une fonction récursivement avec pour argument le pid du père.
En effet, chaque fils peut également être le père d'autres processus fils.
Voici la fonction en question :
# Fonction avec comme paramètre le pid du père :
function cherchefils
{
NOUVEAUPERE=${1}
echo "Nouveau pere = $NOUVEAUPERE "
for FILS in `awk -F" " '$2 ~ /^'$NOUVEAUPERE'$/{print $1}' sortie`
do
# Un fils a un pid forcement plus grand que son père
if [ ${NOUVEAUPERE} -lt ${FILS} ]
then
echo "${NOUVEAUPERE} ->${FILS}"
cherchefils ${FILS}
fi
done
}
Traces de la fonction :
ksh pstree.ksh 202
le paramètre est 202
Nouveau pere = 202
202 ->303
Nouveau pere = 303
303 ->403
Nouveau pere = 403
403 ->404
Nouveau pere = 404
Malgré mes recherches sous google infructueuses, il se peut qu'un algorithme existe à ce sujet.
Si vous avez des pistes sur lesquelles je puisse me tourner, merci de me les indiquer.
Dernière modification par gilthar (Le 29/09/2008, à 15:57)
Ce que j'ai appris, je ne le sais plus. Le peu que je sais encore, je l'ai deviné.
( Nicolas de Chamfort)
Hors ligne
#2 Le 29/09/2008, à 19:39
- Totor
Re : Script : pstree en korn shell.
Salut,
Voici un début de solution je pense (probablement ce que tu recherchais sans une super mise en forme) :
#!/bin/ksh
PID_INI="$1"
affiche_pid()
{
pid_pere=$1
espace="$2 "
pid_trt=$3
if [ ${pid_trt} -ne ${pid_pere} ]; then
ps -ef|awk -v parent="${pid_pere}" '$3==parent {print $2}'|while read pid_fils
do
echo "${espace}${pid_fils}"
(affiche_pid "${pid_fils}" "${espace}" "${pid_trt}")
done
fi
}
[[ "${PID_INI}" == "" ]] && PID_INI="0"
echo "${PID_INI}"
affiche_pid "${PID_INI}" "" "$$"
Attention, les parenthèses sont très importantes lors de l'appelle de la fonction affiche_pid récursive.
EDIT : /bin/bash -> /bin/ksh mais ça ne change rien au fonctionnement
Dernière modification par Totor (Le 29/09/2008, à 19:41)
-- Lucid Lynx --
Hors ligne
#3 Le 29/09/2008, à 20:05
- Link31
Re : Script : pstree en korn shell.
# Un fils a un pid forcement plus grand que son père
Non.
Ça pourrait sembler vrai au début, mais quand tu commences à lancer beaucoup de processus, les PID tournent et on se retrouve avec des PID < 1000 dont le parent a un PID > 15000...
Hors ligne
#4 Le 30/09/2008, à 07:45
- Totor
Re : Script : pstree en korn shell.
Re :
Bon, je me suis dit que cette mise en forme n'était pas vraiment exploitable.
Alors, je me suis penché sur le sujet et en changeant juste une ligne, voilà un petit script qui fourni les informations bien plus lisibles :
#!/bin/ksh
PID_INI="$1"
affiche_pid()
{
pid_pere=$1
espace="$(echo $2|tr "_" " ")|_"
pid_trt=$3
if [ ${pid_trt} -ne ${pid_pere} ]; then
ps -ef|awk -v parent="${pid_pere}" '$3==parent {print $2}'|while read pid_fils
do
echo "${espace}${pid_fils}"
(affiche_pid "${pid_fils}" "${espace}" "${pid_trt}")
done
fi
}
[[ "${PID_INI}" == "" ]] && PID_INI="0"
echo "${PID_INI}"
affiche_pid "${PID_INI}" "" "$$"
voilà ce que cela peut donner :
| |_26101
| | |_26269
| | | |_26344
| |_12453
| |_6433
| |_6581
| |_6725
| |_6728
| |_6895
| |_6898
| |_7045
| | |_7051
| | | |_7052
| | | |_7058
| | | |_7059
| | | |_7060
| | | |_7061
| |_31242
| |_31379
| |_31520
| |_31523
| |_31675
| |_31678
| |_31820
| | |_31821
| | | |_31822
| | | |_31827
| | | |_31828
| | | | |_1290
| | | |_31829
| | | |_31830
à toi de l'agrémenter
Dernière modification par Totor (Le 30/09/2008, à 07:47)
-- Lucid Lynx --
Hors ligne
#5 Le 30/09/2008, à 23:25
- Totor
Re : Script : pstree en korn shell.
Bonsoir,
Je ne connaissais pas cette commande "pstree" et je me suis apperçu que le script que j'avais posté n'y correspondait pas puisqu'il n'affichait pas les parents.
Je m'y suis donc repenché et voilà ce que cela donne :
#!/bin/ksh
PID_INI="$1"
terminal=`tty`
affiche_parent()
{
if [ $1 -eq 0 ]; then
echo ""
else
pid_pere=$(ps --pid $1 -o ppid --no-headers|sed 's/ //g')
parent=("$(affiche_parent "${pid_pere}")")
cmd=("$(ps --pid $1 -o args --no-headers)")
if [ "${parent}" != "" ]; then
printf "${parent}_$1\t\t${cmd}\n">${terminal}
echo "${parent} |"
else
printf "$1\t\t${cmd}\n">${terminal}
echo "|"
fi
fi
}
affiche_fils()
{
pid_pere=$1
espace="$(echo "$2"|tr "_" " ")_"
pid_trt=$3
ps --ppid ${pid_pere} --no-headers -o pid|while read pid_fils
do
if [ ${pid_fils} -ne ${pid_trt} ]; then
cmd=$(ps --pid $1 -o args --no-headers)
printf "${espace}${pid_fils}\t\t${cmd}\n"
(affiche_fils "${pid_fils}" "${espace}|" "${pid_trt}")
fi
done
}
[[ "${PID_INI}" == "" || "${PID_INI}" == "0" ]] && PID_INI="1"
if [ ${PID_INI} -lt 0 ]; then
echo "Numero de processus incorrecte."
exit 1
fi
if [ "$(ps --pid ${PID_INI} -o pid --no-headers)" == "" ]; then
echo "Processus inexistant."
exit 1
fi
espace="$(affiche_parent "${PID_INI}" 1)"
affiche_fils "${PID_INI}" "${espace}" "$$"
exit 0
Cependant, sous AIX, les paramètres de ps peuvent différer pour l'affichage personalisé... à voire !
exemple de rendu :
>pidtree.sh 8688
1 /sbin/init
|_6604 kdeinit Running...
| |_8676 /bin/sh /usr/bin/firefox-2
| | |_8688 /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-2-bin
| | | |_8692 /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-2-bin>ppidtree.sh 6604
1 /sbin/init
|_6604 kdeinit Running...
| |_6610 kdeinit Running...
| |_6625 kdeinit Running...
| |_6662 kdeinit Running...
| |_6665 kdeinit Running...
| | |_6676 kwin [kdeinit] -session 10c66f746f000122211297300000070450
| |_6669 kdeinit Running...
| |_6671 kdeinit Running...
| |_6694 kdeinit Running...
| |_6707 kdeinit Running...
| |_6737 kdeinit Running...
| |_8676 kdeinit Running...
| | |_8688 /bin/sh /usr/bin/firefox-2
| | | |_8692 /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-2-bin
-- Lucid Lynx --
Hors ligne
#6 Le 01/10/2008, à 11:48
- gilthar
Re : Script : pstree en korn shell.
Bonjour,
C'est sympa de voir quelqu'un d'autres scripter. Nous avons des techniques différentes.
Au même moment, j'ai continué sur ce script.
Nous devons avoir le même type de script je pense. Je me suis inspiré de ton affichage (une bonne idée que ce tr).
voici le résultat actuel (père et fils)
#!/usr/bin/ksh
PID_SEARCH="$1"
TEST="/usr/bin/test"
#________________________________________________________________#
# FONCTIONS #
#________________________________________________________________#
cherche_pere()
{
INDEX=0
let PERE=2
PROCESSUS=$PID_SEARCH
# tant que le processus n est pas 1, on recherche le père du processus et on l insere dans un tableau
while $TEST $PERE -ne 1;
do
let INDEX=INDEX+1
PERE=`ps -ef|awk -F" " '$2 ~ /^'${PROCESSUS}'$/{print $3}'`
tab[$INDEX]=$PERE
PROCESSUS=${PERE}
done
# Afficher pere
espace=""
while $TEST ${INDEX} -ne 0;
do
echo "${espace}${tab[$INDEX]}"
let INDEX=INDEX-1
espace="$(echo $espace|tr "_" " ")|_"
done
}
cherche_fils()
{
PID_PERE=$1
PID_PROCESS=$$
espace="$(echo $2|tr "_" " ")|_"
if [ ${PID_PROCESS} -ne ${PID_PERE} ]; then
ps -ef|awk -v parent="${PID_PERE}" '$3==parent {print $2}'|while read PID_FILS
do
echo "${espace}${PID_FILS}"
(cherche_fils "${PID_FILS}" "${espace}")
done
fi
}
#________________________________________________________________#
# MAIN #
#________________________________________________________________#
# Test des arguments
[[ "${PID_SEARCH}" -eq "" ]] && PID_SEARCH="1"
# On teste si le processus existe
RESULT=`ps -ef |grep 1200 |grep -v grep`
if [ -z "`ps -ef|grep ${PID_SEARCH}|grep -v grep`" ]
then
PID_SEARCH=1
fi
#
cherche_pere
echo "${espace}${PID_SEARCH}"
cherche_fils "${PID_SEARCH}" "${espace}"
Dernière modification par gilthar (Le 01/10/2008, à 11:59)
Ce que j'ai appris, je ne le sais plus. Le peu que je sais encore, je l'ai deviné.
( Nicolas de Chamfort)
Hors ligne
#7 Le 01/10/2008, à 13:14
- Totor
Re : Script : pstree en korn shell.
il semble que sous AIX, tu ne puisses pas utiliser les facilités du ps sous ubuntu ?
-- Lucid Lynx --
Hors ligne
#8 Le 01/10/2008, à 13:35
- HP
Re : Script : pstree en korn shell.
et il compile pas pstree sous AIX ?
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#9 Le 01/10/2008, à 13:38
- gilthar
Re : Script : pstree en korn shell.
Non, pstree n'est pas disponible sous AIX sur les serveurs utilisés.
Ce que j'ai appris, je ne le sais plus. Le peu que je sais encore, je l'ai deviné.
( Nicolas de Chamfort)
Hors ligne
#10 Le 04/10/2008, à 16:57
- HP
Re : Script : pstree en korn shell.
Non, pstree n'est pas disponible sous AIX sur les serveurs utilisés.
bizarre :
pstree is a small program that shows the process-listing as a tree (as the name implies...). It has several options to make selection criteria and to change the output style. It should compile under most UNIXes, tested are AIX, HP-UX, A/UX, SunOS, Linux and others.
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#11 Le 05/10/2008, à 20:37
- gilthar
Re : Script : pstree en korn shell.
Bonjour,
Su ces serveurs, cette commande n'est pas disponible.
C'est pour cela que j'écris ce script.
Cdlt.
Ce que j'ai appris, je ne le sais plus. Le peu que je sais encore, je l'ai deviné.
( Nicolas de Chamfort)
Hors ligne
#12 Le 06/10/2008, à 08:21
- Totor
Re : Script : pstree en korn shell.
d'ailleurs, tu en es où ?
-- Lucid Lynx --
Hors ligne