2009-12-05 3 views
0

cette coquille expliquer le problème, après l'exécution de l'arrêt de .sh et rien ne se passe, aucune idée où est mon erreurkillall httpd pour le processus de sommeil

son kill httpd s'il y a plus de 10 processus de sommeil et commencer la httpd avec zéro processus de sommeil

#!/bin/bash 

#this means loop forever 
while [ 1 ]; 
do HTTP=`ps auwxf | grep httpd | grep -v grep | wc -l`; 
#the above line counts the number of httpd processes found running 
#and the following line says if there were less then 10 found running 
if [ $[HTTP] -lt 10 ]; 
then killall -9 httpd; 
#inside the if now, so there are less then 10, kill them all and wait 1 second 
sleep 1; 
#start apache 
/etc/init.d/httpd start; 
fi; 

#all done, sleep for ten seconds before we loop again 
sleep 10;done 

Répondre

1

Pourquoi voudriez-vous tuer les processus enfants? Si vous faites cela, vous tuez toutes les sessions en cours. Ne serait-il pas plus facile de configurer votre configuration de serveur Web de sorte qu'elle corresponde à vos besoins?

Comme Dennis a déjà mentionné votre script devrait ressembler à:

#!/bin/bash 

BINNAME=httpd # Name of the process 
TIMEOUT=10  # Seconds to wait until next loop 
MAXPROC=10  # Maximum amount of procs for given daemon 

while true 
do 
     # Count number of procs 
     HTTP=`pgrep $BINNAME | wc -l` 
     # Check if more then $MAXPROC are running 
     if [ "$HTTP" -gt "$MAXPROC" ] 
     then 
       # Kill the procs 
       killall-9 $BINNAME 
       sleep 1 
       # start http again 
       /etc/init.d/httpd start 
     fi 
     sleep $TIMEOUT 
done 

Formating rend le code plus lisible;)

0

Je ne vois rien de mal à cela.

Cette ligne:

if [ $[HTTP] -lt 10 ]; 

devrait probablement:

if [ ${HTTP} -lt 10 ]; 

même si le vôtre fonctionne.

Si vous ajoutez ceci comme dernière ligne, vous ne devriez jamais voir sa sortie puisque vous êtes dans une boucle infinie while.

echo "At end" 

Si c'est le cas, alors c'est vraiment bizarre.

Faites votre première ligne ressembler à ceci et il affichera la ligne par ligne du script tel qu'il exécute pour vous aider à voir où il va mal:

#!/bin/bash -x 
+0

le rueslt vient de ce type + '[' 1 ']' ++ ++ ps auwxf grep httpd ++ grep -v grep ++ wc -l + HTTP = 72 + '[' 72 -lt 10 ']' + dormir 10 + '[' 1 ']' ++ ++ ps auwxf grep httpd ++ grep -v grep ++ wc -l + HTTP = 70 + '[' 70 -l 10 ']' + sommeil 10 + '[' 1 ']' ++ ps auwxf ++ grep httpd ++ grep -v grep ++ wc -l + HTTP = 67 + '[' 67 -lt 10 ']' + sommeil 10 et n'a jamais tué tous les processus de sommeil httpd tout indice – user172697

+0

Parce que HTTP = 72, par exemple et 72 n'est pas '-lt' 10.Vous testez "less than" ('-lt' signifie" less than "), vos commentaires disent" less than "à deux endroits, mais votre question dit" kill httpd s'il y en a plus de 10 ". Vous devez changer la condition pour laquelle vous testez si vous voulez que cela fonctionne différemment. Sinon, en fonction du script et de la sortie de la trace, cela fonctionne correctement. –

0

Attention aux killall si vous essayez d'écrire des scripts portables. Cela ne signifie pas la même chose sur tous les systèmes: alors que sur Linux, cela signifie "tuer des processus nommés comme ça" sur certains systèmes, cela signifie "tuer tous les processus que j'ai la permission de tuer". Si vous exécutez la version ultérieure en tant que root, l'une des choses que vous tuez est init. Oops.

Questions connexes