#! /usr/bin/python

"Kill mysql slow queries (e.g. db dump!)"

import os
import re
import time
import optparse

def mysqlkill(cutoff):
    f=os.popen("mysql -Ee 'show full processlist'",'r')
    pid=0
    killlist={}
    for line in f:
        m=re.search('     Id: (\d+)',line)
        if m: pid=int(m.group(1))
        m=re.search('Command: (.*)',line)
        if m: command=m.group(1)
        m=re.search('   Time: (\d+)',line)
        if m:
            seconds=int(m.group(1))
            if seconds>cutoff:
                print "Process %d %d s old: %s" % (pid,seconds,command)
                killlist[pid]=seconds
    f.close()
    if len(killlist)==0:
        return

    f=os.popen("mysql",'w');
    for pid,command in killlist.items():
        f.write('kill %d;\n' % pid)
    f.close()
        
if __name__=='__main__':
    usage="Usage: %prog [<options>] [whitelist ips]\n"+__doc__+"\n"
    parser=optparse.OptionParser(usage)
    parser.add_option("-v","--verbose",dest="verbose", action="count", default=0, help="Be verbose")
    parser.add_option("-t","--time",dest="time", action="store", type='int', default=280, help="Number of seconds to allow for a query (280 seconds)")
    parser.add_option("-s","--sleep",dest="sleep", action="store", type='int', default=57, help="Sleep interval between checks (57 seconds)")
    (options,args) = parser.parse_args()

    print "Killing processes over %d seconds old every %d seconds" % (options.time,options.sleep)
    while True:
        mysqlkill(options.time)
        time.sleep(options.sleep)
