quarta-feira, julho 03, 2013

Kill process automágico

Imagine o cenário...

Dois ou mais servidores de aplicação Java (Jetty, Apache Tomcat, Glassfish ou JBoss) executando na mesma máquina.

Precisando constantemente executar o comando ps aux | grep java para recuperar os processos dos servidores de aplicação em execução, você cria um pequeno script bash:

#!/bin/sh

if [ "$#" -eq "1" ]
then
 ps aux | grep $1 | grep -v "/usr/local/bin/psa" | grep -v "grep"
else
 echo "usage: psa PATTERN"
fi

exit $?


Depois de zilhares de restarts nesses servidores de aplicação você percebe que o script de shutdown da maioria desses servidores, em alguns casos, não finaliza o processo. Então, logicamente, seria mais efetivo executar kill -9 PID do processo, em vez de esperar a execução do shutdown e ainda ter que verificar se o processo realmente foi finalizado. Então, como obter o PID do processo e finalizá-lo automagicamente? Simples assim...

#! /bin/sh
case "$1" in
    start)
        echo "Starting Apache Tomcat.";
        /usr/local/tomcat/bin/startup.sh
        echo "";
    ;;
    stop)
        echo -n "Shutting down Apache Tomcat.";
        TOMCAT_PID=`ps aux | grep java | grep tomcat | grep -v grep | awk {'print $2'}`;
        kill -9 $TOMCAT_PID;
        echo "";
    ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac
exit 0

Pronto! Agora sempre que stop for o parâmetro para o script você terá certeza que o processo foi finalizado.