Este articulo habla acerca de como implementar un servicio Java en Linux usando Apache Commons Daemon.Commons Daemon es la API de Apache para correr procesos en Linux o Windows. En el articulo de hoy vamos a ver como implementar un simple servicio desde la JVM, el codigo Java y el Script del Linux Daemon.

Actualmente estoy trabajando con un linux Ubuntu Server 7.10 y Java 1.6. Como primer paso tenemos que instalar Java y Commons Daemon, a continuacion los comandos.

1. Para instalar el java SDK hacemos..

 $ sudo apt-get install sun-java6-jdk

Esto instala el JDK de Sun (Si queres podes instalar otra distrubucion o version, como por ejemplo icetea open JDK.

2. Instalar JSVC (Apache Commons Daemon)

 $sudo apt-get install jsvc

JSVC es el binario que permite correr a aplicaciones Java como procesos en Linux.

3. El codigo Java. Aqui debemos implementar la interfaz Daemon el cual sera llamado por el servicio jsvc. Yo ODIO el vi, por eso uso nano como editor en el linux. La idea es teminar con codigo java asi que podes usar el editor que prefieras.

import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;

public class Test implements Daemon {

@Override
public void init(DaemonContext arg0) throws Exception {
  System.out.println("starting app...");
  while (true) {
    System.out.println(System.currentTimeMillis());
    Thread.sleep(1000);
  }
}

@Override
public void destroy() {
  System.out.println("destroy called");
}

@Override
public void start() throws Exception {
  System.out.println("start called");
}

@Override
public void stop() throws Exception {
  System.out.println("stop called");
}
}

4. Compilar el codigo Java, como todos ya saben supongo tienen que tener el JAR de commons-daemon en el classpath, lo pueden encontrar aca.

 javac -cp .:commons-daemon-jar Test.java

5. Hay que generar un shell script que va a actuar como linux daemon.

 nano /etc/init.d/testd

Esto abre el editor parecido al VI, el codigo a continuacion:

echo "Setting enviroment variables..."
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.03
export PATH=$PATH:$JAVA_HOME/bin

DAEMON_HOME=/usr/bin
PID_FILE=/home/myuser/test.pid
HOME=/home/myuser
USER=myuser
RETVAL=0
TMP_DIR=/var/tmp
CLASSPATH=.:/usr/share/java/commons-daemon.jar
$JAVA_HOME/lib/tools.jar\

case "$1" in
 start)

 echo "Starting Daemon Test"
 $DAEMON_HOME/jsvc \
 -user $USER \
 -home $JAVA_HOME \
 -Djava.io.tmpdir=$TMP_DIR \
 -pidfile $PID_FILE \
 -outfile $HOME/log.out \
 -errfile $HOME/log.err \
 -cp $CLASSPATH \
 Test

 echo "test daemon started OK."
 exit $?;;

 stop)
 echo "Stopping Test..."
 $DAEMON_HOME/jsvc \
 -stop \
 -pidfile $PID_FILE \
 Test
 echo "test stopped"
 exit $?
 ;;

 *)
 echo "Usage test start/stop"
 exit 1;;
esac

5. Este es el final donde hacemos correr nuestro daemon de la siguiente manera

 /etc/init.d/testd start

6. Para detener el daemon ejecutamos el siguiente comando:

 /etc/init.d/testd stop

Eso es todo, que lo disfruten.

Categories: javalinux

Rodrigo Asensio

Apasionado por la tecnología

7 Comments

David · December 30, 2011 at 3:32 pm

Lo has hecho para Centos ??? no logro instalar el jsvc

Catia Silva · July 27, 2012 at 11:38 am

Hello!

I’m trying to use your code to create java daemons in fedora but i get some errors. Could you please help me?

I appreciate that you please send me an email for us to talk because i really don’t get it what is going wrong.

Thank you very much

Juan · December 1, 2012 at 12:05 pm

Y si mi Daemon utiliza otras clases para su funcionamiento? por ejemplo una clase que haga la conexion a base datos.

Rodrigo Asensio · December 1, 2012 at 12:40 pm

Entonces la clase Test deberia en su inicio inicializar esas connections a la database

Rodrigo Asensio · December 1, 2012 at 12:40 pm

what kind of errors ?

Rodrigo Asensio · December 1, 2012 at 12:41 pm

no, nunca lo probe en centos. Solo debian/ubuntu

Juan · December 5, 2012 at 7:24 pm

Rodrigo, en el punto 4 en vez de compilar Test.java puedo compilar un .jar . Es decir mi Daemon no es solo una clase sino un conjunto de clases.

Leave a Reply

Your email address will not be published. Required fields are marked *