Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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.

gilthar a écrit :
# 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 wink

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 ? yikes


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.

gilthar a écrit :

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