## page was renamed from JavaServiceWrapper = JavaServiceWrapper = The Java Service Wrapper enables a Java Application to be run as a Windows Service or UNIX Daemon. It also monitors the health of your Application and JVM. http://wrapper.tanukisoftware.com/doc/english/product-overview.html Community Editions: * wget http://wrapper.tanukisoftware.com/download/3.5.25/wrapper-linux-x86-32-3.5.25.tar.gz , 32 bit * wget http://wrapper.tanukisoftware.com/download/3.5.25/wrapper-linux-x86-64-3.5.25.tar.gz , 64 bit = Integrate with other apps = * http://wrapper.tanukisoftware.com/doc/english/integrate.html * http://wrapper.tanukisoftware.com/doc/english/integrate-simple-nix.html == Sample Maven App to integrate == '''Maven project structure''' {{{ . |-- pom.xml |-- src | `-- main | |-- java | | `-- org | | `-- allowed | | `-- bitarus | | `-- JavaServiceApp.java | `-- resources | `-- simplelogger.properties `-- target |-- archive-tmp |-- classes | |-- org | | `-- allowed | | `-- bitarus | | `-- JavaServiceApp.class | `-- simplelogger.properties |-- javaServiceApp-0.0.1-jar-with-dependencies.jar |-- javaServiceApp-0.0.1.jar |-- maven-archiver | `-- pom.properties `-- surefire 15 directories, 8 files }}} '''pom.xml''' {{{#!highlight xml 4.0.0 org.allowed.bitarus javaServiceApp jar 0.0.1 javaServiceApp http://maven.apache.org maven-assembly-plugin 2.4 jar-with-dependencies org.allowed.bitarus.JavaServiceApp make-assembly package single org.slf4j slf4j-api 1.7.7 org.slf4j slf4j-simple 1.7.7 }}} '''src/main/resources/simplelogger.properties''' {{{ org.slf4j.simpleLogger.logFile=/tmp/JavaServiceApp.log org.slf4j.simpleLogger.defaultLogLevel=debug org.slf4j.simpleLogger.showDateTime=true org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z }}} '''src/main/java/org/allowed/bitarus/JavaServiceApp.java''' {{{#!highlight java package org.allowed.bitarus; public class JavaServiceApp{ public static void main(String [] args){ org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(JavaServiceApp.class); while(true){ try{ log.debug("Test JavaServiceApp"); Thread.sleep(10000); } catch(Exception ex){ log.error( ex.getMessage() ); } } } } }}} == Integration with JavaServiceWrapper == {{{#!highlight sh adduser jsa cp target/javaServiceApp-0.0.1-jar-with-dependencies.jar /home/jsa/ cp /tmp/wrapper-linux-x86-32-3.5.25/lib/wrapper.jar /home/jsa cp /tmp/wrapper-linux-x86-32-3.5.25/src/conf/wrapper.conf.in /home/jsa/wrapper.conf cp /tmp/wrapper-linux-x86-32-3.5.25/src/bin/sh.script.in /etc/init.d/jsa chmod 755 /etc/init.d/jsa cp /tmp/wrapper-linux-x86-32-3.5.25/bin/wrapper /usr/bin/wrapper cp /tmp/wrapper-linux-x86-32-3.5.25/lib/libwrapper.so /usr/lib/libwrapper.so }}} '''/etc/init.d/jsa''' , change APP and WRAPPER {{{ # Application APP_NAME="JavaServiceApp" APP_LONG_NAME="Java Service App" # Wrapper WRAPPER_CMD="/usr/bin/wrapper" WRAPPER_CONF="/home/jsa/wrapper.conf" PIDDIR="/home/jsa" RUN_AS_USER=jsa }}} '''/home/jsa''' structure {{{ . |-- javaServiceApp-0.0.1-jar-with-dependencies.jar |-- wrapper.conf |-- wrapper.jar `-- wrapper.log }}} '''/home/jsa/wrapper.conf''' {{{ #encoding=UTF-8 wrapper.lang.folder=/home/jsa/lang wrapper.java.command=/opt/java/bin/java set.JAVA_HOME=/opt/java wrapper.java.command=%JAVA_HOME%/bin/java wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp wrapper.java.classpath.1=/home/jsa/wrapper.jar wrapper.java.classpath.2=/home/jsa/javaServiceApp-0.0.1-jar-with-dependencies.jar wrapper.java.library.path.1=/usr/lib wrapper.java.additional.auto_bits=TRUE wrapper.java.additional.1= wrapper.app.parameter.1=org.allowed.bitarus.JavaServiceApp wrapper.console.format=PM wrapper.console.loglevel=INFO wrapper.logfile=/home/jsa/wrapper.log wrapper.logfile.format=LPTM wrapper.logfile.loglevel=INFO wrapper.logfile.maxsize=0 wrapper.logfile.maxfiles=0 wrapper.syslog.loglevel=NONE wrapper.ignore_sequence_gaps=TRUE wrapper.pidfile.strict=TRUE wrapper.console.title=@app.long.name@ wrapper.check.deadlock=TRUE wrapper.check.deadlock.interval=60 wrapper.check.deadlock.action=RESTART wrapper.check.deadlock.output=FULL wrapper.filter.trigger.1000=[Loaded java.lang.OutOfMemoryError wrapper.filter.action.1000=NONE wrapper.filter.trigger.1001=java.lang.OutOfMemoryError wrapper.filter.action.1001=RESTART wrapper.filter.message.1001=The JVM has run out of memory. wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n wrapper.name=@app.name@ wrapper.displayname=@app.long.name@ wrapper.description=@app.description@ wrapper.ntservice.dependency.1= wrapper.ntservice.starttype=AUTO_START wrapper.ntservice.interactive=false }}} '''Start service''', /etc/init.d/jsa start . The wrapper and service should be running under jsa account. '''Stop service''', /etc/init.d/jsa stop . == Init script without using the Java Service Wrapper == This script does not require the JavaServiceWrapper and probably will run on all Linux distributions. '''/etc/init.d/jsa2''' {{{#!highlight bash # chkconfig: 345 99 99 # description: Starts and stops the jsa process USER=jsa PROG=jsa PIDFILE="/tmp/jsa.pid" PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin" LOG="/tmp/jsa.log" JAVA="/opt/java/bin/java" JARFILE="/home/jsa/javaServiceApp-0.0.1-jar-with-dependencies.jar" start(){ echo "$PROG started with user $USER" su - $USER -c "$JAVA -jar $JARFILE " >> $LOG & /bin/sleep 2 PID=`ps uax | grep java | grep $PROG | grep $USER | head -n 1 | awk '{print $2}'` echo "$PROG running with PID: $PID" echo "$PID" > $PIDFILE } status(){ PID=`cat $PIDFILE` echo "Running $PROG with PID: $PID" } stop(){ echo "Stop called for $PROG" PID=`cat $PIDFILE` echo "PID to kill $PROG $PID" kill -9 $PID rm $PIDFILE } # switch case "$1" in start) start ;; status) status ;; stop) stop ;; restart) stop start ;; *) echo "$PROG start|status|stop|restart" exit 1 ;; esac }}}