Bonjour à tous,
Je développe une fonction pour un script shell sous ksh qui doit me renvoyer le nombre d'instances du programme principal en cours de traitement, et s'arrêter si ce nombre est supérieur à 1.
Relativement simple, pensai-je.
Seulement voilà, les résultats que j'obtiens sont différents de ce que je suis en droit d'attendre. Le nombre de processus que j'obtiens en résultat est souvent supérieur ou inférieur.
J'ai probablement dû me tromper quelque part, mais impossible de trouver où est mon erreur !
Même en appelant deux fois mon calcul, je n'ai pas deux fois le même résultat !
Toute aide est la bienvenue !
Mon code :
function NombreDeProcessus
{
PROCESSUS=$1 ;
VAL_1=`ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]`;
VAL_2=$(ps -eo args | grep -F "${PROCESSUS}" | grep -vF "grep" | wc -l | tr -d [:blank:]);
echo "Valeur 1 : '$VAL_1'" ;
echo "Valeur 2 : '$VAL_2'" ;
return $VAL_2;
}
# exclure grep
Posté par gaaaaaAab . Évalué à 7.
$ ps -edf|grep Eterm
gab 7579 28182 0 14:47 ? 00:00:00 Eterm
gab 7685 7580 0 14:50 pts/5 00:00:00 grep Eterm
$ ps -edf |grep Eter[m]
gab 7579 28182 0 14:47 ? 00:00:00 Eterm
sinon, man pidof ?
[^] # Re: exclure grep
Posté par Ludo . Évalué à 1.
Ça marche d'enfer ! Une seule question : comment est ce possib' ??!!
Je vois pas pourquoi en rajoutant des crochets on arrive à supprimer le grep 0_ô.
Si quelqu'un pouvait écrire une petite explication... Merci d'avance !
(apparemment c'est un truc «classique»... honte à moi...)
[^] # Re: exclure grep
Posté par gaaaaaAab . Évalué à 2.
par contre, ps affiche la ligne de commande telle qu'elle a été saisie (donc avec les crochets), qui, du coup, n'est pas matchée par le grep (pour lequel les crochets ont été interprétés par le shell).
comme c'est pas très clair ce que je dis, voici l'exemple :
$ps -edf |grep gre[p]
gab 8436 7580 0 16:19 pts/5 00:00:00 grep gre[p]
[^] # Re: exclure grep
Posté par n6p7 . Évalué à 4.
[^] # Re: exclure grep
Posté par gaaaaaAab . Évalué à 3.
merci pour cette utile précision :)
[^] # Re: exclure grep
Posté par JJD . Évalué à 5.
En fait le shell interprète bien les crochets et si dans le répertoire courant il existe un fichier grep, alors le shell qui va remplacer la chaîne gre[p] par grep et, à ce moment-là, les crochets ne servent plus à rien.
Pour bien comprendre, voici un exemple :
$ touch grep
$ echo gre[p]
grep
$ ps -ef | grep gre[p]
toto 19592 18514 0 17:47 pts/5 00:00:00 grep grep
$ ps -ef | grep "gre[p]"
jjdoti 19625 18514 0 17:51 pts/5 00:00:00 grep gre[p]
$ rm grep
$ echo gre[p]
gre[p]
$ ps -ef | grep gre[p]
$ ps -ef | grep gre[p]
toto 19601 18514 0 17:48 pts/5 00:00:00 grep gre[p]
Moralité : il faut mettre des quottes autour du motif à passer à grep.
A+
JJD
[^] # Re: exclure grep
Posté par gaaaaaAab . Évalué à 2.
Merci !
[^] # Re: exclure grep
Posté par Octabrain . Évalué à -1.
Bash :
$ ps aux | grep gre[p]
xxx 2892 0.0 0.1 3476 804 pts/0 R+ 13:33 0:00 grep gre[p]
$
Dash (shell minimal posix) :
$ ps aux | grep gre[p]
$
Zsh :
$ ps aux PG gre[p]
zsh: no matches found: gre[p]
$
[^] # Re: exclure grep
Posté par Octabrain . Évalué à 1.
[^] # Re: exclure grep
Posté par 태 (site web personnel) . Évalué à 2.
$ ps -edf |grep Eter[m]
zsh: no matches found Eter[m]
Le comportement de bash quand les expansions n'existent pas est pour moi une source d'erreur : ça rend des scripts imprévisibles suivant les fichiers présents.
$ ps -edf | grep 'Eter[m]'
manu 8151 2373 27 18:16 pts/0 00:11:15 Eterm
Je lui dis explicitement que les quotes doivent pas être expansés et passés tels quels à grep (j'aurais aussi pu utiliser noglob).
# tout ça pour ça :)
Posté par zecrazytux (site web personnel) . Évalué à 2.
Seulement pidof est dispo sur GNU/linux mais pas sur d'autres unix comme *BSD.
Et comme tu fais du KSH, j'ai dans l'idée que t'es sur Unix proprio ou *BSD.
je ferais plutôt:
if [ $(pgrep -x process | wc -l) -gt 1 ]; then
echo coincoin
fi
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.