Translate

martes, 30 de agosto de 2011

Tomcat en modo demonio: jsvc

Es posible ejecutar Tomcat, y por ende Alfresco, en modo demonio. La principal ventaja de este sistema es que nos permite ejecutar Tomcat como usuario no-root y usar puertos privilegiados. Es importante aclarar que según la documentación vamos a poder usar los puertos <1024  pero única y exclusivamente a nivel de tomcat, no de Alfresco. Esto nos va a permitir por ejemplo ejecutar Tomcat en el puerto 80. Sin embargo para poder usar FTP y CIFS desde un usuario no privilegiados deberemos usar puertos alternativos y seguir la guía de la wiki y redireccionar los puertos a nivel de firewall. Esto es debido a que solo se demoniza el proceso de tomcat y no las aplicaciones que ejecuta.

jsvc viene con los binarios de Tomcat con lo que solo necesitaremos compilarlos:

    cd $CATALINA_HOME/bin
    tar xvfz commons-daemon-native.tar.gz
    cd commons-daemon-1.0.x-native-src/unix
    ./configure
    make
    cp jsvc ../..
    cd ../..

Si no tenemos definida la variable de entorno JAVA_HOME tendremos que pasar la ruta en el configure:
./configure --with-java=/usr/java/jdk1.6.0_19/

A continuacion pongo el init script que uso para arrancar/parar Alfresco con jsvc
#!/bin/sh
#
# tomcat           Utilizing the jsvc start and stop the servlet engine.
#
# chkconfig: 345 99 10
# description: Starts and stops the tomcat servlet engine.
# Source function library.
. /etc/rc.d/init.d/functions
JAVA_HOME=/usr/java/jdk1.6.0_15/
CATALINA_HOME=/opt/alfresco/tomcat
DAEMON_HOME=/opt/alfresco/tomcat/bin/
TOMCAT_USER=tomcat
TOMCAT_GROUP=tomcat
TOMCAT_PID=/var/run/jsvc_alfresco.pid
TMP_DIR=/opt/alfresco/tomcat/temp
CATALINA_OPTS=
CLASSPATH=$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/bin/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar
CATALINA_WORK_DIR=$CATALINA_HOME/work
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
WAIT_MAX=2
case "$1" in
start)
  #
  # Start Tomcat
  #
echo -n "Starting Tomcat: "
$DAEMON_HOME/jsvc -user $TOMCAT_USER -pidfile $TOMCAT_PID -home $JAVA_HOME -jvm server -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=196M -Xms512m -Xmx2048m -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$TMP_DIR -outfile /opt/alfresco/tomcat/logs/catalina.out -errfile '&1' $CATALINA_OPTS -cp $CLASSPATH org.apache.catalina.startup.Bootstrap

sleep 2s
if [ -f $TOMCAT_PID ]; then
             echo_success
else
             echo_failure
fi
echo
;;
stop)
#
# Stop Tomcat
#
echo -n "Stopping Tomcat: "
PID=`cat $TOMCAT_PID`
kill $PID 2>/dev/null 1>/dev/null
if [ `ps -p ${PID} > /dev/null 2>&1` ]; then
             echo_failure
else
             echo_success
             rm -f $TOMCAT_PID > /dev/null 2>&1
fi
echo
;;
flush)
#
# Stop Tomcat
#
   echo -n "Stopping Tomcat: "
   PID=`cat $TOMCAT_PID`
   kill $PID 2>/dev/null 1>/dev/null
   if [ `ps -p ${PID} > /dev/null 2>&1` ]; then
                echo_failure
   else
                echo_success
                rm -f $TOMCAT_PID > /dev/null 2>&1
   fi
   echo
   echo -n "Flushing Tomcat CACHE ($CATALINA_WORK_DIR) : "
   rm -rf $CATALINA_WORK_DIR
   if [ -e $CATALINA_WORK_DIR ]; then
                echo_failure
                echo
                exit 1;
   fi
   mkdir $CATALINA_WORK_DIR
   chown $TOMCAT_USER.$TOMCAT_GROUP $CATALINA_WORK_DIR
   if [ ! -e $CATALINA_WORK_DIR ]; then
                echo_failure
                echo
                exit 1;
   fi
   echo_success
   echo
   ;;
*)
   echo "Usage: $0 {start|stop|flush}"
   exit 1;;
esac
exit 0

Este script además tiene el parámetro flush que nos va a permitir eliminar de una forma fácil el contenido del directorio work.

Hay que tener en cuenta que cuando usamos jsvc ya no estamos invocando a los scripts startup.sh ni shutdown.sh con lo cual no se parará el proceso usando estos ficheros. Todas las variables que tuvieramos definidas en este fichero como en el catalina.sh deberán ser movidas al nuevo script.

Cuando miremos los procesos en ejecución veremos 2 procesos. El primero levanta los puertos y el segundo es el que atiende las peticiones.

root     16126     1  0 12:32 ?        00:00:00 jsvc.exec -user tomcat -pidfile /var/run/jsvc_alfresco.pid -home /usr/java/jdk1.6.0_19/ -jvm server -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=160M -Xms512m -Xmx1024m -Dcatalina.home=/opt/alfresco/tomcat -Djava.io.tmpdir=/opt/alfresco/tomcat/temp -outfile /opt/alfresco/tomcat/logs/catalina.out -errfile &1 -cp /usr/java/jdk1.6.0_19//lib/tools.jar:/opt/alfresco/tomcat/bin/commons-daemon.jar:/opt/alfresco/tomcat/bin/bootstrap.jar org.apache.catalina.startup.Bootstrap
tomcat   16127 16126 52 12:32 ?        00:01:15 jsvc.exec -user tomcat -pidfile /var/run/jsvc_alfresco.pid -home /usr/java/jdk1.6.0_19/ -jvm server -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=160M -Xms512m -Xmx2048m -Dcatalina.home=/opt/alfresco/tomcat -Djava.io.tmpdir=/opt/alfresco/tomcat/temp -outfile /opt/alfresco/tomcat/logs/catalina.out -errfile &1 -cp /usr/java/jdk1.6.0_19//lib/tools.jar:/opt/alfresco/tomcat/bin/commons-daemon.jar:/opt/alfrescod/tomcat/bin/bootstrap.jar org.apache.catalina.startup.Bootstrap

Parando Tomcat

Arrancando Tomcat via jsvc,  entra en mono deomnio, lo que significa que no va a escuchar en el puerto 8005 y por tanto no se va a poder detener via catalina.sh (o shutdown.sh).
Lo que se hace es enviar un SIGTERM o SIGINT al proceso que pertenece a root. En nuestro caso se encuentra el pid en $CATALINA_PID.

2 comentarios:

  1. Hola, quisiera felicitarte porque este blog, a pesar que llevas pocos post, es el nivel que necesitamos los que llevamos un tiempo con Alfresco. Temas no repetidos, experiencias reales, y casos mas empresariales. Te felicito y espero que sigas haciendo grandes aportes.

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar