2010-11-05 16 views
2

J'essaye d'écrire un script qui compte le nombre de processus en cours d'exécution correspondant à un patern. Si elle dépasse une valeur codée en dur, alors faites quelque chose ... sinon faites autre chose.Script Bash avec if/else de base et nombre de processus en cours d'exécution basé sur un pattern

Je trouve le nombre de processus en utilisant:

ps ax | grep process_name | wc -l | sed -e "s: ::g" 

Si la sortie de la commande ci-dessus est supérieure à 15..it devrait echo « Terminé ». Sinon, écho "Non terminé".

Jusqu'à présent, j'ai cela, mais il ne fonctionne pas:

numprocesses=ps ax | grep sms_queue | wc -l | sed -e "s: ::g" 
if [ $numprocesses -le "15" ] ; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 

Répondre

8
numprocesses=$(ps ax | grep '[s]ms_queue' | wc -l) 
if [[ $numprocesses -gt 15 ]] ; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 

Vous avez eu quelques problèmes.

  • Votre instruction if ne correspond pas tout à fait à vos spécifications. Pour capturer la sortie de la commande xyz, vous devez utiliser $(xyz).
  • Pas besoin d'enlever les espaces de la sortie.
  • Si vous ne voulez pas ramasser le processus grep ainsi (parce que lui aussi a le modèle qu'il recherche), vous devez utiliser le modèle grep [firstchar]rest (ou vous pouvez utiliser | grep sms_queue | grep -v grep pour retirer le processus grep du compte ainsi.
  • pas nécessaire d'utiliser la chaîne dans la comparaison "15".
+2

Comme cette réponse répertorie toutes sortes d'améliorations en plus de l'erreur primaire, je voudrais ajouter la suggestion d'utiliser une expression arithmétique: 'if (($ numprocesses> 15)); alors ... " C'est plus agréable à lire. – MForster

+0

@paxdiablo: ne pensez-vous pas vraiment que * chaîne * "15" est différente de votre * numéro * 15? :) –

+0

@MForster: c'est encore moins portable que '[[]]' stuff.Je conseillerais d'utiliser le vieux '' aka 'test'. –

1

Si vous voulez copier la sortie d'une commande dans une variable, utilisez cette syntaxe:

variable=$(my command) 
+0

ou variable = \ 'ma commande \' –

+3

C'est exact, mais je pense que '$ (...)' est préférable. Il est plus facile à lire (ne peut pas être confondu avec ''...' ') et peut être imbriqué. – MForster

+0

@MForster: les backticks peuvent être imbriqués aussi (bien que seulement un niveau de profondeur) –

0

que diriez-vous

pgrep -c sms_queue 

?

Et la version entière (portable) du script ressemblerait à ceci:

if [ "$(pgrep -c sms_queue)" -le 15 ]; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 
+0

Portable? C'est intéressant. Votre script ne semble pas fonctionner dans 'csh'. Ou était-ce une définition égoïste de portable que je n'avais jamais entendu auparavant? :-) – paxdiablo

+1

@paxdiablo: C'était la définition POSIX. Je suis bien conscient que ce script ne fonctionnera pas dans csh, perl, et la plupart des autres interpréteurs de langages de script différents. –