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:
Si no tenemos definida la variable de entorno JAVA_HOME tendremos que pasar la ruta en el configure:
A continuacion pongo el init script que uso para arrancar/parar Alfresco con jsvc
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.
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
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.
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
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.