Bon, voila c'est fait et crone. On devrait etre moins embetes (au maximum, ca ramera pendant une a deux minutes).
Je poste les scripts pour ceux que ca interesse:
Code:#!/bin/sh
# surveillance des processes YaBB:
# si on trouve un process perl qui boucle, on attache truss quelques
# secondes pour avoir une trace puis on le tue
LOGFILE=~/yabb.log
echo "" >> $LOGFILE
echo "########################################" >> $LOGFILE
echo "Timestamp: `date`" >> $LOGFILE
echo "########################################" >> $LOGFILE
echo "" >> $LOGFILE
echo ">>> liste des processes du serveur web:" >> $LOGFILE
ps ux -U www >> $LOGFILE
# on envoie la liste au script awk:
echo ">>> analyse:" >> $LOGFILE
ps ux -U www|awk -v LOGFILE=$LOGFILE -f check_yabb.awk -
et
Code:#!/bin/awk
BEGIN { MATCHED_ONCE=0 }
/perl/ { if(match($10,"[123456789]:")) {
MATCHED_ONCE=1
ZPID=$2
ZTRUSSFILE=sprintf("~/trussfiles/%d.out", ZPID)
printf "Un Perl en boucle:\n\tPID: %d, TIME: %s\n\tTrace dans: %s\n", ZPID, $10, ZTRUSSFILE >>LOGFILE
CMD=sprintf("truss -o %s -p %d&", ZTRUSSFILE, ZPID)
CMD=sprintf("%s\nTRUSSER=$! && sleep 5 && kill $TRUSSER", CMD)
system(CMD)
CMD=sprintf("kill %d; sleep 5", ZPID)
system(CMD)
CMD=sprintf("kill -KILL %d", ZPID)
system(CMD) } }
END { if(MATCHED_ONCE==0) print "Pas de Perl en boucle" >>LOGFILE
fflush(LOGFILE)
close(LOGFILE) }
On verra ce qu'on obtiendra de tout ca.