#!/usr/bin/perl # prozesswürger (c) by chip # das benutzen bzw. ausführen dieses scripts erfolgt auf eigenes risiko # ich übernehme keine haftung für schäden die durch dieses script entstehen. # ab welchen load soll der przess gekillt werden ? $maxload=100.01; #name des prozesses #der name muss 100Pro dem in der prozessliste entsprechen $processname="mysqld"; #wohin mit dem log $logfile="./mysqlkiller.log"; #mysql passwort $mysqlpass="xxxxxxxxx"; #---------------------- while(1) { $all_load=`cat /proc/loadavg`; ($load1,$load2,$load3)=$all_load=~ /(.*?) (.*?) (.*?) .*/; print "Serverload: >$load1<, >$load2<, >$load3<\n"; if($load2 >=$maxload){ killwhat($processname); } sleep(20); } sub killwhat { my $what=shift; @ps=`ps -A`; foreach $line(@ps){ chomp $line; if($line=~ /$processname$/){ print getHumanTime()." --> kill $line\n"; ($killpid)=$line=~ /(\d+) .*/; system("kill -9 $killpid"); system("echo ".getHumanTime(). " --> kill $line >>$logfile"); print "waiting 30 secs for mysql ...\n"; sleep(30); system("mysqlcheck -uroot -p$mysqlpass -A --auto-repair"); } } } sub getHumanTime { my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); my $CTIME_String = localtime(time); $Monat+=1; $Jahrestag+=1; $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat; $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag; $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden; $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten; $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden; $Jahr+=1900; my @Wochentage = ("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); my @Monatsnamen = ("","Januar","Februar","Maerz","April","Mai","Juni", "Juli","August","September","Oktober","November","Dezember"); my $finale="$Wochentage[$Wochentag], $Monatstag. $Monatsnamen[$Monat] $Jahr, $Stunden:$Minuten:$Sekunden"; return $finale; }