Normalmente, las aplicaciones Java son ejecutadas en un terminal en sistemas Unix. Esto requiere que una cuenta de usuario esté conectada al sistema a todo momento y un terminal debe mantenenerse abierto.

Hay varias desventajas en esto, desde seguridad, a desempeño del sistema, a simplemente correr el riesgo de un usuario presionar una tecla equivocada en el terminal y eliminar la aplicación Java.

El Java Service Wrapper aborda estos problemas haciendo posible instalar su aplicación como un demonio, ofreciendo detección automática de las herramientas de administración de servicios (también conocidas como sistemas init) disponibles en su sistema operativo, o le permite configurar un sistema específico para usar cuando inicia su aplicación como un demonio.

¿Eres usuario de Windows? Por favor, lea nuestras Preguntas y Respuestas para Windows.

¿Qué es un demonio?

Los demonios UNIX son similares a los servicios de Windows. Ellos le permiten ejecutar su aplicación en segundo plano y son iniciados automáticamente al iniciar el sistema.

El problema es que Java por si sola no puede ser ejecutada como un demonio. El usuario solo tiene que desconectarse de la máquina para eliminar Java.

El Java Service Wrapper no solamente lo hace posible, pero hace que sea más fácil ejecutar cualquier aplicación Java como un demonio. Tambén agriega conmutación por error avanzada, recuperación de errores y funciones de análisis para asegurar que su aplicación tenga el máximo tiempo de actividad posible.

Clase Simple de Java HelloWorldServer

Para este ejemplo, usaremos la aplicación simple HelloWorldServer que se ejecutará en segundo plano. Por favor lea la descripción completa de la aplicación para aprender como crear y montar la aplicación HelloWorldServer para este ejemplo.

Configurando la clase HelloWorldServer

El primer paso es cambiar nuestra clase HelloWorldServer class en un demonio y configurar el Java Service Wrapper para ejecutar nuestra aplicación. Esto se puede hacer con la mayoría de las aplicaciones sin la necesidad de escribir códigos Java.

Estructura del Directorio

El Wrapper es muy flexible y se puede configurar para que funcione con cualquier estructura de directorio. Para este ejemplo, recomendamos una estructura de directorio que es limpia y que puede reutilizarse incluso para aplicaciones bastante complicadas. Por favor recree la siguiente estructura de directorio bajo un directorio arbitrario de su elección. Lo llamaremos directorio raíz $(EXAMPLE_HOME). Este es una extensión de la estructura del directorio que se encuentra en la sección descripción de HelloWorldServer.

Estructura del Directorio:
$(EXAMPLE_HOME)/
$(EXAMPLE_HOME)/bin/
$(EXAMPLE_HOME)/conf/
$(EXAMPLE_HOME)/lang/
$(EXAMPLE_HOME)/lib/
$(EXAMPLE_HOME)/lib/classes/
$(EXAMPLE_HOME)/logs/

Descargue el Java Service Wrapper

Por favor descargue la última versión del Java Service Wrapper desde la página de Descargas, extraiga los archivos y guardelos en el directorio de su elección. Nosotros lo llamaremos %EXAMPLE_HOME%.

Copie los Archivos del Wrapper

El Java Service Wrapper para UNIX consiste de cuatro componentes primarios: el Wrapper binario, un archivo jar, una librería nativa, usada por el archivo jar, y un shell script, usado para iniciar el Wrapper y realizar acciones como controlarlo como daemon. Es necesario copiar estos archivos como sigue:

Copiar archivos:
cp $(WRAPPER_HOME)/bin/wrapper $(EXAMPLE_HOME)/bin/wrapper
cp $(WRAPPER_HOME)/lib/wrapper.jar $(EXAMPLE_HOME)/lib/wrapper.jar
cp $(WRAPPER_HOME)/lib/libwrapper.so $(EXAMPLE_HOME)/lib/libwrapper.so
cp $(WRAPPER_HOME)/src/bin/App.sh.in $(EXAMPLE_HOME)/bin/helloworldserver

Después, es necesario hacer que el archivo script sea ejecutable:

chmod +x helloworldserver

Clave de licencia:

Las ediciones Estándar y Profesional del Java Service Wrapper requieren una clave de licencia para que puedan ser ejecutadas. El Wrapper incluye una clave que le dará la oportunidad de ejecutar el Wrapper por 15 minutos. Por favor haga uso de esta clave por ahora. Si desea obtener un período de prueba más largo, solo presione el botón Free Trial (versión de prueba gratuita) en la parte superior de esta página.

Copiar el archivo de la clave de licencia:
cp $(WRAPPER_HOME)/src/conf/wrapper-license-time.conf $(EXAMPLE_HOME)/conf/wrapper-license.conf

Archivo de configuración del Wrapper:

Por fin, copiar el archivo de configuraciones del Wrapper. Editaremos el archivo en la siguiente sección.

Copiar archivo de configuración:
cp $(WRAPPER_HOME)/src/conf/wrapper.conf.in $(EXAMPLE_HOME)/conf/wrapper.conf

Archivo de Configuración del Wrapper

Abra el archivo $(EXAMPLE_HOME)/conf/wrapper.conf en un editor de texto de su elección.

Es necesario localizar y modificar las siguientes propiedades.

Archivo de configuración
wrapper.java.command=java
wrapper.java.command.loglevel=INFO

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=HelloWorldServer

wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/classes

wrapper.java.library.path.1=../lib

wrapper.logfile=../logs/wrapper.log
  • La propiedad wrapper.java.command se usa para especificar la ubicación del comando Java que se usará. El valor que hemos especificado será ubicado en la ruta del sistema. También es posible especificar una ruta absoluta.

  • La propiedad wrapper.java.command.loglevel es opcional, pero es de gran ayuda como método de depuración para la línea de comandos Java que genere el Wrapper. Le recomendamos que incluya esta propiedad cuando inicie su aplicación. Sin embargo, puede inhabilitarla una vez que su aplicación este funcionando sin problemas.

  • La propiedad wrapper.java.mainclass se usa para especificar la clase principal que se pasa a Java cuando es implementada. Este es un punto de confusión para nuevos usuarios, pero en la mayoría de los casos esta clase principal ayuda al Wrapper, en lugar de la clase principal de su aplicación. El Wrapper tiene diferentes métodos de integración, pero para este ejemplo usaremos el método más simple llamado Método de Integración #1 (WrapperSimpleApp).
    Este método usa la clase org.tanukisoftware.wrapper.WrapperSimpleApp para administrar el ciclo de vida de la máquina JVM y la comunicación externa con el Wrapper. Por ahora no se preocupe por este punto.

  • La clase principal de nuestra aplicación HelloWorldServer se pasa como primer parámetro usando la propiedad wrapper.app.parameter.1. Es posible pasar parámetros adicionales a la aplicación HelloWorldServer al agregar propiedades adicionales incrementando índices, por ejemplo: wrapper.app.parameter.2=P1.

    Aunque no se muestra aquí, es posible agregar parámetros Java adicionales usando las propiedades wrapper.java.additional.<n>.

  • El siguiente paso es especificar la ruta de la clase. Esto se puede hacer usando las propiedades wrapper.java.classpath.<n>. Necesitamos dos entradas de la ruta de la clase para nuestra aplicación. La primera es incluir el archivo wrapper.jar, que incluye las clases auxiliares del Wrapper. La segunda entrada incluye el directorio lib/classes, donde la clase HelloWorldServer está ublicada.

  • El Wrapper usa una librería nativa, libwrapper.so, para implementar algunas de sus funciones. Librerías nativas no son usadas por muchas aplicaciones Java, y lo más probable es que aún no haya experimentado esto antes. Las propiedades wrapper.java.library.path.<n> se usan para especificar la ubicación de las librerías. Por ahora no tenemos que preocuparnos por este punto.

  • La propiedad wrapper.logfile se usa para ordenarle al Wrapper donde escribir los archivos de registro de valores.

Ahora ya le decimos al Wrapper como ejecutar nuestra aplicación Java.

Algo muy importante es tener en mente que todos los valores de las propiedades son especificados con valores de rutas que son relativos a la ubicación del binario wrapper.exe.

Shell script

Abra el archivo shell script $(EXAMPLE_HOME)/bin/helloworldserver en un editor de texto de su elección.

Por el comienzo del archivo, verá dos variables: APP_NAME y APP_LONG_NAME. Por favor reemplace los valores con el nombre de su aplicación.

Shell script
# Application
APP_NAME="helloworldserver"
APP_LONG_NAME="Hello World Server"

Hay otras variables útiles para configurar el Wrapper como un demonio, pero las veremos un poco más adelante en este tutorial.

Ejecutando HelloWorldServer en un terminal

El Wrapper ha sido configurado. Empecemos a probar nuestra configuración ejecutando el Wrapper en un terminal.

Abra un terminal nuevo y vaya al directorio $(EXAMPLE_HOME) con el comando cd. El Wrapper y nuestra aplicación se pueden iniciar de la siguiente manera:

bin/helloworldserver console

Recuerde que la ubicación del archivo de configuraciones es relativa a la ubicación del binario del Wrapper. Esto puede ser un poco contra-intuitivo, pero aumenta en gran medida la confiabilidad del Wrapper al iniciar usando diferentes métodos.

Cuando el Wrapper inicia, verá algo como lo siguiente:

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |
wrapper  | --------------------------------------------------------------------
wrapper  | Thank you for your interest in the Java Service Wrapper.
wrapper  |
wrapper  | You are running with a full featured trial License Key which will
wrapper  | allow you to run or restart the Java Service Wrapper as many times
wrapper  | as you like.  Each invocation of the Wrapper will shutdown
wrapper  | automatically after 15 minutes.
wrapper  |
wrapper  | This limited trial License Key is useful for quick configuration
wrapper  | tests on various machines without the need to request a trial
wrapper  | license.  If more time is required, you can also immediately obtain
wrapper  | a one-month Free trial license:
wrapper  |   https://wrapper.tanukisoftware.com/trial
wrapper  |
wrapper  | The Java Service Wrapper requires a License Key to activate the
wrapper  | software.  License Keys can be purchased on the Java Service Wrapper
wrapper  | web site:
wrapper  |   https://wrapper.tanukisoftware.com/purchase
wrapper  |
wrapper  | This trial License Key in intended for testing and development and
wrapper  | should not be used as part of a production environment.
wrapper  | --------------------------------------------------------------------
wrapper  | 
wrapper  | 
wrapper  | Launching a JVM...
wrapper  | Java Command Line:
wrapper  |   Command[0] : /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
wrapper  |   Command[1] : -Djava.library.path=../lib
wrapper  |   Command[2] : -classpath
wrapper  |   Command[3] : ../lib/wrapper.jar:../lib/classes
wrapper  |   Command[4] : -Dwrapper.key=sSRU9TooPnyds7IrRI2rFtKRHEgc8E4A
wrapper  |   Command[5] : -Dwrapper.port=32000
wrapper  |   Command[6] : -Dwrapper.jvm.port.min=31000
wrapper  |   Command[7] : -Dwrapper.jvm.port.max=31999
wrapper  |   Command[8] : -Dwrapper.pid=8557
wrapper  |   Command[9] : -Dwrapper.version=3.5.32-pro
wrapper  |   Command[10] : -Dwrapper.native_library=wrapper
wrapper  |   Command[11] : -Dwrapper.arch=x86
wrapper  |   Command[12] : -Dwrapper.cpu.timeout=10
wrapper  |   Command[13] : -Dwrapper.jvmid=1
wrapper  |   Command[14] : org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper  |   Command[15] : HelloWorldServer
jvm 1    | WrapperManager: Initializing...
jvm 1    | Accepting connections on port: 9000

El mensaje generado en la parte superior del archivo de registro de valores es porque estamos usando una licencia de prueba temporal. Este le indica donde puede adquirir una licencia temporal con un plazo más largo y también como comprar una licencia, si así lo desea.

Las líneas siguientes a "Java Command Line:" mostran todos los argumentos del comando que el Wrapper usa al iniciar la máquina JVM. Es muy útil para resolver problemas. Una vez que esté funcionando, por favor descomente la propiedad wrapper.java.command.loglevel. El resto de este ejemplo asumirá que ya lo ha hecho.

Si ha adquirido una licencia, esto es lo que observará:

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |   Licensed to {licensee}
wrapper  |
wrapper  | Launching a JVM...
jvm 1    | WrapperManager: Initializing...
jvm 1    | Accepting connections on port: 9000

Puede detener su aplicación en cualquier momento presionando CTRL-C. El Wrapper siempre mantiene un registro mostrando por qué una aplicación se detuvo. De esta manera, verá en su archivo de registro de valores algo como esto:

wrapper  | CTRL-C trapped.  Shutting down.
wrapper  | <-- Wrapper Stopped

Ejecutando HelloWorldServer como un demonio

Una vez que la configuración del Wrapper ha sido verificada y esta correcta, estamos listos para instalar el Wrapper como un demonio.

Instalando el demonio

Esto se puede hacer usando el comando install del scrip shell de la siguiente manera:

sudo bin/helloworldserver install

NOTA

Tenga en cuenta que es necesario ser un usuario raíz para hacerlo.

Usted verá algo como lo que a continuación se presenta, confirmando que el demonio ha sido instalado.

Detected Ubuntu or Debian:
Installing the Hello World Server Application daemon using systemd...
creating default service file...
Created symlink from /etc/systemd/system/multi-user.target.wants/testwrapper.service to /etc/systemd/system/testwrapper.service.

NOTA

Los mensajes pueden ser diferentes de acuerdo con su sistema operativo y la herramienta de administración del servicio usada para instalar el demonio. Lo mismo ocurre con otros comandos que se muestran a continuación en esta página.

Iniciando el demonio

Ahora puede iniciar su demonio usando el archivo shell script nuevamente como usuario raíz.

sudo bin/helloworldserver start

Usted verá algo como lo que a continuación se presenta, confirmando que el demonio ha sido iniciado.

Waiting for Hello World Server Application...
running: PID:17548

Esto muestra que el script está realmente solicitando al sistema init que inicie el demonio y espere hasta que se detecte que el proceso está siendo ejecutado, y asi muestre su PID. Después de eso, el terminal le permitirá inserir otros comandos, pero el Wrapper seguirá ejecutandose en segundo plano.

Puede cerciorarse que el Wrapper esté funcionando abriendo el archivo de registro de valores o usando el comando status:

bin/helloworldserver status
Hello World Server Application (installed with systemd) is running: PID:17548, Wrapper:STARTED, Java:STARTED

Eso le informa si el Wrapper ha iniciado y lanzado la aplicación Java con éxito.

Instalando e iniciando el demonio de una vez

Desde la versión 3.5.28, el script también tiene el comando installstart para instalar y iniciar a la vez.

sudo bin/helloworldserver installstart

Si el demonio es instalado e iniciado con éxito, verá la suguiente salida:

Detected Ubuntu or Debian:
Installing the Test Wrapper Sample Application daemon using systemd...
creating default service file...
Created symlink from /etc/systemd/system/multi-user.target.wants/testwrapper.service to /etc/systemd/system/testwrapper.service.
Waiting for Test Wrapper Sample Application...
running: PID:20720

Deteniendo el demonio

Cuando desee detener el el demonio, puede usar el comando stop del shell script como usuario raíz.

sudo bin/helloworldserver stop

Puede cerciorarse que el Wrapper esté funcionando abriendo el archivo de registro de valores o usando el comando status:

bin/helloworldserver status
Hello World Server (installed with systemd) is not running.

Reiniciando el demonio

El demonio puede ser iniciado usando los comandos restart o condrestart. restart detenerá el demonio si este está siendo ejecutado, y lo reiniciará. Si el demonio no está siendo ejecutado, el comando simplemente lo iniciará. condrestart solamente reiniciará el demonio si este esté siendo ejecutado.

sudo bin/helloworldserver restart
sudo bin/helloworldserver condrestart

Pausando y resumiendo el demonio

Desde la versión 3.5.31, el Wrapper puede ser pausado y resumido usando el shell script, pero es necesario hacerlo pausable primero. Para hacerlo, hay que descomentar la línea "#PAUSABLE=true" (remover '#') ubicado en la parte superior del script. Tenga en cuenta que el demonio debe reiniciarse para que esta propiedad tenga efecto.

PAUSABLE=true

Un poco más abajo en el script, verá la línea "#PAUSABLE_MODE=signals", que hace posible configurar el modo usado para pausar y resumier el demonio. Actualmente, hay dos modos disponibles:

- 'signals', que usa SIGUSR1 y SIGUSR2 para comunicar las acciones pausar y resumir al Wrapper

- 'file' que usa el archivo de comando.

El valor por defecto es signals', por ser más rápido para ejecutar y más seguro, ya que no hay que preocuparse con los permisos del archivo de comando.

PAUSABLE_MODE=signals

Ahora podrá iniciar el Wrapper y ejecutar el comando pause. La salida de registro de valores debe ser:

bin/helloworldserver pause
Pausing Hello World Server.

Puede cerciorarse que el Wrapper en verdad se ha pausado usando el comando status:

bin/helloworldserver status
Hello World Server (installed with systemd) is running: PID:7050, Wrapper:PAUSED, Java:DOWN_CLEAN

Ahora puede resumir la aplicación usando el comando resume:

bin/helloworldserver resume
Resuming Hello World Server.

También se puede confirmar que el Wrapper está siendo ejecutando nuevamente usando el comando status:

bin/helloworldserver status
Hello World Server (installed with systemd) is running: PID:7050, Wrapper:PAUSED, Java:DOWN_CLEAN

Desintalando el demonio

El Wrapper está actualmente configurado para iniciar nuevamente cuando su sistema se reinicia. Como esto es un teste, usted probablemente preferirá remover el demonio, como adelante:

sudo bin/helloworldserver remove

Usted verá algo como lo que a continuación se presenta, confirmando que el demonio ha sido desinstalado.

sudo bin/testwrapper remove
Detected Ubuntu or Debian:
Stopping Test Wrapper Sample Application...
Test Wrapper Sample Application was not running.
Removing Test Wrapper Sample Application daemon from systemd...
Removed symlink /etc/systemd/system/multi-user.target.wants/testwrapper.service.

Tenga en cuenta que el script primero va a cerciorarse que el Wrapper no está siendo ejecutado antes de desinstalarlo.

Después de desinstalar de demonio, el comando status mostrará lo siguiente:

bin/helloworldserver status
Hello World Server (not installed) is not running.

Elijiendo la herramienta de administración de servicios

Dependiendo de la plataforma, hay diferentes sistemas que pueden ser usados para instalar y ejecutar un demonio. Por ejemplo, en Linux systemd, upstart e initd son comúnmente utilizados. En AIX, un demonio puede ser instalado con SRC o initd.

La tabla a continuación brinda una descripción general de las diferentes herramientas de administración de servicios usadas por el Wrapper para instalar un demonio,, dependiendo de la plataforma. Los que figuran en la parte superior son más avanzados y generalmente preferidos.

Linux
AIX
MacOSX
FreeBSD
Other UNIX platforms
SystemdSrcLaunchdrc.dInit.d
UpstartInit.d
Init.d

Dependiendo de la distribución (Linux), la versión del sistema operativo y la configuración del sistema operativo, algunas de las herramientas de administración de servicios pueden no estar instaladas. Sin embargo, el shell script del Wrapper, tiene la capacidad de detectar qué herramienta (s) de administración de servicios están presentes en la máquina. Cada vez que varias herramientas son posibles para un sistema operativo dado (p.ej. en Linux y AIX), el Wrapper eligirá automáticamente en orden de prioridad. Por ejemplo, en Linux, systemd es preferible a upstart, que a su vez tiene preferéncia ante initd. Este comportamiento predeterminado ha sido introducido en versión 3.5.31 y es configurado por la siguiente línea ubicada en la parte superior del script:

SERVICE_MANAGEMENT_TOOL=auto

Es posible que desee especificar explícitamente otra herramienta de administración de servicios que la que eligió automáticamente el Wrapper. En este caso, es necesario configurar la propiedad anterior con el nombre de otro sistema.

SERVICE_MANAGEMENT_TOOL=initd

NOTA

Recuerde que el Wrapper debe ser reinstalado para que esta propiedad tenga efecto.

Después de reinstalar el servicio, verá algo como lo siguiente:

sudo bin/helloworldserver install
Detected Ubuntu or Debian:
Installing the Hello World Server daemon using init.d..
 Adding system startup for /etc/init.d/helloworldserver ...
   /etc/rc0.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc1.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc6.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc2.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc3.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc4.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc5.d/S20helloworldserver -> ../init.d/helloworldserver

Después de eso, el demonio usará initd la próxima vez que se inicie.

ADVERTENCIA

Si la herramienta de administraci@on de servicios no está presente en el sistema o si la instalación ha fallado pro alguna razón, el shell script retornará un código de error 1.

Cuando sus testes hayan terminado, no se olvide de desinstalar de demonio para prevenir que se inicie en el siguiente arranque del sistema.

Referencia: Iniciar su Aplicación con el Wrapper