2009-12-03 4 views
1

J'ai ce script bash dont le travail consiste à surveiller un fichier journal pour l'occurrence d'une certaine ligne. Lorsqu'il est localisé, le script envoie un avertissement par courrier électronique, puis se termine lui-même. Pour une raison quelconque, il continue de fonctionner. Comment puis-je être sûr de mettre fin script bash ci-dessous:Le script bash de surveillance ne s'arrête pas

#!/bin/sh 

tail -n 0 -f output.err | grep --line-buffered "Exception" | while read line 
do 
    echo "An exception has been detected!" | mail -s "ALERT" [email protected] 
    exit 0 
done 

Répondre

5

que vous ouvrez un sous-shell dans le while read et qui est sous-shell est sortie, pas celle qui convient.

Essayez avant d'entrer dans la boucle while:

SHELLPID=$$ 

Et puis dans la boucle:

kill $SHELLPID 
exit 0 

Ou changer votre boucle pour ne pas utiliser un sous-shell.

Puisque le script parent sera toujours dans le tail -f qui ne finit jamais, je pense que vous n'avez pas d'autre choix que de le tuer du sous-shell interne.

+0

Cela n'a pas fonctionné. $ PPID renvoie le PID de démarrage (l'instance de shell à partir de laquelle le script est exécuté). Un moyen de réécrire le script sans la boucle while? – Daniil

+0

Vérifiez la mise à jour. En fin de compte, vous avez toujours besoin d'un sous-shell, car un processus doit être en attente de la queue tandis que d'autres vérifie la sortie. –

+0

Cela a fonctionné parfaitement! Un grand merci :) – Daniil

0

Essayez quelque chose comme ceci:

 
tail -n 0 -f output.err | grep --line-buffered "Exception" | while read line 
do 
    echo "An exception has been detected!" | mail -s "ALERT" [email protected] 
    kill -term `ps ax | grep tail | grep output.err | awk '{print $1}'` 
done 

Cela devrait fonctionner, à condition que vous avez seulement une queue en gardant un œil sur ce dossier.

+0

C'est trop (pas de jeu de mots). –