Process-Killer

Francisco wrote this script to end unfinished qmail-smtpd sessions.

nano /var/qmail/bin/process-killer

=====================================================
#!/bin/bash

#hecho para qmail-smtp y qmail-remote
#Licenced with GNU/GPL v2
#1er argumento: el proceso
#2do argumento: la antigüedad del proceso
#ejemplos del argumento 2: 1hora 10minutos 1minuto 10segundos todos

if [ "$1" = "" ]; then echo falta el proceso como argumento, debe ser qmail-smtpd o qmail-remote; exit; fi
if [ "$2" = "" ]; then echo falta el tiempo como argumento, debe ser uno de estos: 1hora 10minutos 1minuto 10segundos todos; exit; fi

if [ "$2" = "1hora" ]; then TIEMPO="[0-9]:[0-9][0-9]:[0-9][0-9]"; fi

if [ "$2" = "30minutos" ]; then TIEMPO="[3-9][0-9]:[0-9][0-9]|[0-9]:[0-9][0-9]:[0-9][0-9]"; fi
if [ "$2" = "10minutos" ]; then TIEMPO="[1-9][0-9]:[0-9][0-9]|[0-9]:[0-9][0-9]:[0-9][0-9]"; fi
if [ "$2" = "1minuto" ]; then TIEMPO="0[1-9]:[0-9][0-9]|[1-9][0-9]:[0-9][0-9]|[0-9]:[0-9][0-9]:[0-9][0-9]"; fi
if [ "$2" = "10segundos" ]; then TIEMPO="00:[0-9][0-9]|0[1-9]:[0-9][0-9]|[1-9][0-9]:[0-9][0-9]|[0-9]:[0-9][0-9]:[0-9][0-9]"; fi
if [ "$2" = "todos" ]; then TIEMPO=":"; fi

if [ "$TIEMPO" = "" ]; then echo segundo argumento mal insertado, debe ser uno de estos: 1hora 30minutos 10minutos 1minuto 10segundos todos; exit; fi

ps ax -o etime,pid,comm --no-heading | grep "$1" | egrep -q "$TIEMPO";
case $? in
0) echo Se mataron procesos $1 que llevan mas de $2 corriendo;
echo;
echo Date: $(date);
echo;
echo "      TIME    PID    COMAND";
 ps ax -o etime,pid,comm --no-heading | grep "$1" | egrep "$TIEMPO";

echo;
echo "Informacion de Conexiones (solo para qmail-smtpd):";
echo;
for name in \
 `ps ax -o etime,pid,comm --no-heading | grep "$1" | egrep "$TIEMPO" | awk '{print $2}'`; do \
    expr "$(cat /proc/$name/environ)" : '.*\(TCPREMOTEIP=[0-9]*.[0-9]*.[0-9]*.[0-9]*\).*'; \
    expr "$(cat /proc/$name/environ)" : '.*\(TCPLOCALPORT=[0-9]*\).*'; \
    expr "$(cat /proc/$name/environ)" : '.*\(TCPREMOTEPORT=[0-9]*\).*'; \
    expr "$(cat /proc/$name/environ)" : '.*\(TCPREMOTEHOST=..........................................\).*'; done

kill \
`ps ax -o etime,pid,comm --no-heading | grep "$1" | egrep "$TIEMPO" | awk '{print $2}'`;
echo;;
1) exit 1;;
*) exit 99;;
esac;
=====================================================

chmod a+x /var/qmail/bin/process-killer

crontab -e

# HUNGED PROCESSES
10 07 */2 * * /var/qmail/bin/process-killer qmail-smtpd 1hora | mail -e -s "SMTP Sessions Stucked" postmaster@domain.com
20 07 */15 * * /var/qmail/bin/process-killer qmail-remote 1hora | mail -e -s "SMTP Sessions Stucked" postmaster@domain.com
##