2016-08-24 13:21:41 +00:00
#!/usr/bin/env python2
# -*-coding:UTF-8 -*
import time
import datetime
import calendar
import redis
import os
2016-08-24 14:52:01 +00:00
import signal
from subprocess import PIPE , Popen
2016-08-24 13:21:41 +00:00
import ConfigParser
2016-08-24 13:53:00 +00:00
import json
2016-08-24 13:21:41 +00:00
from prettytable import PrettyTable
2016-08-24 13:53:00 +00:00
# CONFIG VARIABLES
2016-08-24 15:28:39 +00:00
threshold_stucked_module = 60 * 60 * 1 #1 hour
refreshRate = 1
2016-08-24 13:53:00 +00:00
log_filename = " ../logs/moduleInfo.log "
2016-08-24 14:52:01 +00:00
command_search_pid = " ps a -o pid,cmd | grep {} "
command_restart_module = " screen -S \" Script \" -X screen -t \" {} \" bash -c \" ./ {} .py; read x \" "
2016-08-24 15:28:39 +00:00
def getPid ( module ) :
2016-08-24 14:52:01 +00:00
p = Popen ( [ command_search_pid . format ( module + " .py " ) ] , stdin = PIPE , stdout = PIPE , bufsize = 1 , shell = True )
for line in p . stdout :
splittedLine = line . split ( )
if ' python2 ' in splittedLine :
2016-08-24 15:28:39 +00:00
return int ( splittedLine [ 0 ] )
else :
return None
def kill_module ( module ) :
print ' '
print ' -> trying to kill module: ' , module
pid = getPid ( module )
if pid is not None :
os . kill ( pid , signal . SIGUSR1 )
time . sleep ( 1 )
if getPid ( module ) is None :
print module , ' has been killed '
print ' restarting ' , module , ' ... '
2016-08-24 14:52:01 +00:00
p2 = Popen ( [ command_restart_module . format ( module , module ) ] , stdin = PIPE , stdout = PIPE , bufsize = 1 , shell = True )
2016-08-24 13:53:00 +00:00
2016-08-24 15:28:39 +00:00
else :
print ' killing failed, retrying... '
time . sleep ( 3 )
os . kill ( pid , signal . SIGUSR1 )
time . sleep ( 1 )
if getPid ( module ) is None :
print module , ' has been killed '
print ' restarting ' , module , ' ... '
p2 = Popen ( [ command_restart_module . format ( module , module ) ] , stdin = PIPE , stdout = PIPE , bufsize = 1 , shell = True )
else :
print ' killing failed! '
time . sleep ( 7 )
2016-08-24 13:53:00 +00:00
2016-08-24 13:21:41 +00:00
if __name__ == " __main__ " :
configfile = os . path . join ( os . environ [ ' AIL_BIN ' ] , ' packages/config.cfg ' )
if not os . path . exists ( configfile ) :
raise Exception ( ' Unable to find the configuration file. \
Did you set environment variables ? \
Or activate the virtualenv . ' )
cfg = ConfigParser . ConfigParser ( )
cfg . read ( configfile )
# REDIS #
server = redis . StrictRedis (
host = cfg . get ( " Redis_Queues " , " host " ) ,
port = cfg . getint ( " Redis_Queues " , " port " ) ,
db = cfg . getint ( " Redis_Queues " , " db " ) )
while True :
2016-08-24 13:35:23 +00:00
table1 = PrettyTable ( [ ' # ' , ' Queue ' , ' Amount ' , ' Paste start time ' , ' Processing time for current paste (H:M:S) ' , ' Paste hash ' ] , sortby = " Processing time for current paste (H:M:S) " , reversesort = True )
table2 = PrettyTable ( [ ' # ' , ' Queue ' , ' Amount ' , ' Paste start time ' , ' Time since idle (H:M:S) ' , ' Last paste hash ' ] , sortby = " Time since idle (H:M:S) " , reversesort = True )
2016-08-24 13:21:41 +00:00
num = 0
for queue , card in server . hgetall ( " queues " ) . iteritems ( ) :
key = " MODULE_ " + queue
value = server . get ( key )
if value is not None :
timestamp , path = value . split ( " , " )
if timestamp is not None and path is not None :
num + = 1
2016-08-24 13:35:23 +00:00
startTime_readable = datetime . datetime . fromtimestamp ( int ( timestamp ) )
2016-08-24 13:21:41 +00:00
processed_time_readable = str ( ( datetime . datetime . now ( ) - startTime_readable ) ) . split ( ' . ' ) [ 0 ]
2016-08-24 13:53:00 +00:00
2016-08-24 13:35:23 +00:00
if int ( card ) > 0 :
2016-08-24 14:52:01 +00:00
if int ( ( datetime . datetime . now ( ) - startTime_readable ) . total_seconds ( ) ) > threshold_stucked_module :
log = open ( log_filename , ' a ' )
log . write ( json . dumps ( [ queue , card , str ( startTime_readable ) , str ( processed_time_readable ) , path ] ) + " \n " )
kill_module ( queue )
2016-08-24 13:35:23 +00:00
table1 . add_row ( [ num , queue , card , startTime_readable , processed_time_readable , path ] )
2016-08-24 14:52:01 +00:00
2016-08-24 13:35:23 +00:00
else :
table2 . add_row ( [ num , queue , card , startTime_readable , processed_time_readable , path ] )
2016-08-24 13:21:41 +00:00
os . system ( ' clear ' )
2016-08-24 13:53:00 +00:00
print ' Working queues: \n '
2016-08-24 13:35:23 +00:00
print table1
2016-08-24 13:53:00 +00:00
print ' \n '
print ' Ideling queues: \n '
2016-08-24 13:35:23 +00:00
print table2
2016-08-24 15:28:39 +00:00
time . sleep ( refreshRate )