Expert en Grep\Egrep ?

Résolu/Fermé
Jo' - 5 mars 2009 à 10:53
 Jo' - 6 mars 2009 à 10:03
Bonjour,

J'ai une liste de processus dont je dois vérifier s'ils sont en cours d'execution sur le serveur, je dois ainsi retourner les processus non actifs, tout cela en ligne de commande.

Je cherche donc à faire une commande du type : grep (ma liste de processus à vérifier), mais comment faire pour qu'il me retourne les éléments de ma liste non trouvé ?

D'avance un grand merci pour votre aide.

16 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 14:53
Salut,

Un truc du genre :
while read fich
do
ps -e | grep "$fich" >/dev/null
if [ "$?" = 1 ]
then
echo "$fich n'est pas en service"
fi
done < ma_liste_de_processus
Pas testé...
;-))
0
Salut Jipicy !

Tout d'abord, merci pour ta réponse !

J'ai utilisé ton code dans une boucle FOR (car je suis plus à l'aise), le tout sur une seule ligne (c'est une prérogative). Mais j'ai le message suivant :

ksh: syntax error: `done' unexpected

Vois-tu pourquoi il ne veut pas de mon done ? Voici ma ligne de commande :

for n in xntpd uxpwmgr uxgpw sendmail; do ps -e | grep n >/dev/null; if [ "$?" = 1 ] Then echo "$n n'est pas en service" fi; done;


Merci encore et bonne fin de semaine.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 16:57
Il faut un "point virgule" entre le crochet fermant du test et le then ainsi qu'avant le "fi" ;
if [ "$?" = 1 ] ; Then blablabla ; fi
;-))
0
J'ai mis la ligne suivante mais maintenant j'ai le message :

ksh: syntax error: `fi' unexpected

for n in xntpd uxpwmgr uxgpw uxfx; do ps -e | grep n >/dev/null; if [ "$?" = 1 ] ; Then echo "$n n'est pas en service" ; fi ; done;

Il se fiche de moi non ? :)

Merci encore pour ton aide
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 17:27
Oups... c'est "then" et non pas Then ;-\
0
Haaan bien vu !

Bon là ça fonctionne !!

Par contre ça me retourne rien, pourtant j'ai mis de tester "toto" comme processus mais il me renvoi le prompt sans me dire que toto n'est pas en service...

$ for n in xntpd uxpwmgr toto uxgpw uxfx; do ps -e | grep n >/dev/null; if [ "$?" = 1 ] ; then echo "$n n'est pas en service" ; fi ; done;
$

Tu vois d'où ça peut venir ? Sinon, elle veut dire quoi la condition du IF ?

Merci beaucoup pour ton aide en tout cas.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 17:48
Change le "ps -e" par "do echo "$n" | grep 'n' >/dev/null;"

Le if teste la valeur du code de retour (contenu dans la variable "$?") de la dernière commande exécutée, qui doit être égal à "0" (zéro) si la commande a réussi (dans ton cas ça revient à dire que le grep a bien trouvé un "n" dans le nom du processus) ou égal à "1" (un) si la commande a échoué (pas de "n" dans le nom du processus).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci pour l'explication.

Et bien y'a du mieux ! J'ai lancé la commande avec une 15aine de noms et j'ai eu 3 réponses :

uxfw n'est pas en service
syslogd n'est pas en service
toto n'est pas en service

Pourtant quand je test uxfw, il le trouve bien :

$ ps -e | grep uxfw
20215 ? 15:54 uxfw
$ ps -e | grep sendmail
1936 ? 0:00 sendmail
$

C'est bizare quand même
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 18:14
Lance ta ligne de commande en la faisant précéder de "set -xv;" et affiche le résultat...

PS. "set -" pour revenir à la normale
0
Voilà :

$ set -xv ps -e | grep uxfw
set -xv ps -e | grep uxfw
+ grep uxfw
+ set -xv ps -e
$ set -xv ps -e | grep sendmail
set -xv ps -e | grep sendmail
+ grep sendmail
+ set -xv ps -e
$ set -xv ps -e | grep toto
set -xv ps -e | grep toto
+ grep toto
+ set -xv ps -e
$
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 18:27
Je voulais dire à rajouter devant ta commande avec la boucle et les if...
0
$ set -xv ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do echo "$n" | grep 'n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
+ grep n
+ echo xntpd
+ 1> /dev/null
+ [ 0 = 1 ]
+ grep n
+ echo uxpwmgr
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxpwmgr
uxpwmgr
+ grep n
+ echo uxgpw
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxgpw
uxgpw
+ grep n
+ echo toto
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo toto
toto
+ grep n
+ echo uxfx
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxfx
uxfx
+ grep n
+ echo sendmail
+ 1> /dev/null
+ [ 0 = 1 ]
$
0
Et voici le résultat normal avec cette ligne de commande

$ for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do echo "$n" | grep 'n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
uxpwmgr n'est pas en service
uxgpw n'est pas en service
toto n'est pas en service
uxfx n'est pas en service
$
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 18:38
grep 'n'
Il manque le signe "$" :
grep '$n'
0
Franchement merci pour ta patience !

$ set -xv ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do echo "$n" | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
+ grep $n
+ echo xntpd
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo xntpd
xntpd
+ grep $n
+ echo uxpwmgr
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxpwmgr
uxpwmgr
+ grep $n
+ echo uxgpw
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxgpw
uxgpw
+ grep $n
+ echo toto
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo toto
toto
+ grep $n
+ echo uxfx
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxfx
uxfx
+ grep $n
+ echo sendmail
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo sendmail
sendmail
$

et le résultat :

$ for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do echo "$n" | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
xntpd
uxpwmgr
uxgpw
toto
uxfx
sendmail
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 18:47
Change le echo par "ps -e" maintenant...
0
$ set -xv ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do ps -e | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
set -xv ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do ps -e | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
+ set -xv
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo xntpd
xntpd
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxpwmgr
uxpwmgr
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxgpw
uxgpw
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo toto
toto
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo uxfx
uxfx
+ grep $n
+ ps -e
+ 1> /dev/null
+ [ 1 = 1 ]
+ echo sendmail
sendmail
$ set - ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do ps -e | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
set - ; for n in xntpd uxpwmgr uxgpw toto uxfx sendmail ; do ps -e | grep '$n' >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
xntpd
uxpwmgr
uxgpw
toto
uxfx
sendmail
$
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
5 mars 2009 à 18:57
Effectivement y'a un os si tous ces processus tournent ;-((

Bon affiche :
ps -e | grep sendmail; echo $?
ps -e | grep toto; echo $?
0
$ ps -e | grep sendmail; echo $?
1936 ? 0:00 sendmail
0
$ ps -e | grep toto; echo $?
1
$ ps -e | grep uxfw; echo $?
20215 ? 15:55 uxfw
0
$

J'ai mis uxfw car il était affiché et pourtant le process existe.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
5 mars 2009 à 19:29
Salut,

jipicy t'a déjà dit qu'il faut mettre "$n" et pas '$n'
Quand tu mets '$n' tu vas chercher un $ suivi d'un n est ce n'est pas ca que tu veux.
$ for n in nautil knotif bash kded gdm toto;do ps -e | grep "$n" >/dev/null; if [ "$?" = 0 ] ; then echo "$n" ; fi ; done;
nautil
knotif
bash
kded
gdm
$ for n in nautil knotif bash kded gdm toto;do ps -e | grep "$n" >/dev/null; if [ "$?" = 1 ] ; then echo "$n" ; fi ; done;
toto

0
Roo lala.. Mais oui !!

Bon bein du coup ça marche nickel maintenant.

Un grand merci pour ta patience et ton aide Jipicy. Merci également à toi Lami20j (c'est pas la première fois que tu me dépannes !)

Bonne fin de semain !
0