#!/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="xxxxxxxxxx";

#----------------------


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;	

}

	




