Search code examples
javalinuxubuntuserviceupstart

How do I run Java as a service on Ubuntu?


So after 2 days (yes I'm a complete rookie when it comes to servers) trying to get this working I give up and turn to SO for help :)

I want to start my java app on start, log to a logfile. That's it :)

start on runlevel [2345]
stop on runlevel [!2345]


#Respawn the process if it crashes
#If it respawns more than 10 times in 5 seconds stop
respawn
respawn limit 10 5

expect fork

script
    cd /home/ubuntu/admin/
    mvn spring-boot:run > /var/log/upstart/admin.log 2>&1
end script

Running "sudo start admin" works and I get "admin start/running" in console.. No log is created and the java app is not started.. ?

What am I missing?

How do I run Java as a service on Ubuntu?


Solution

  • I don't mean to sidetrack, but I've deployed Java applications on Ubuntu in production since 2010 and had very little success with Upstart. I use init.d scripts and start-stop-daemon. Side bonus: it works on more distros.

    Create /etc/init.d/my-java-app:

    #!/bin/sh
    #
    # my-java-app My Java App
    #
    # chkconfig: - 80 05
    # description: Enable My Java Application
    #
    
    ### BEGIN INIT INFO
    # Provides:          my-java-app
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Description:       My Java Application
    # Short-Description: Enable My Java Application
    ### END INIT INFO
    
    DESC="my java app"
    NAME=my-java-app
    PIDFILE=/var/run/$NAME.pid
    RUN_AS=ubuntu
    WORK_DIR=/home/ubuntu/admin
    DAEMON=/usr/bin/mvn
    DAEMON_OPTS="spring-boot:run"
    
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
    
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.2-14) to ensure that this file is present
    # and status_of_proc is working.
    . /lib/lsb/init-functions
    
    do_start() {
        start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE \
            --background \
            --chuid $RUN_AS \
            --chdir $WORK_DIR \
            --exec $DAEMON -- $DAEMON_OPTS
    }
    
    do_stop() {
        start-stop-daemon --stop --quiet --pidfile $PIDFILE
        if [ -e $PIDFILE ]
            then rm $PIDFILE
        fi
    }
    
    case "$1" in
        start)
        echo -n "Starting $DESC: $NAME"
        do_start
        echo "."
        ;;
        stop)
        echo -n "Stopping $DESC: $NAME"
        do_stop
        echo "."
        ;;
        restart)
        echo -n "Restarting $DESC: $NAME"
        do_stop
        sleep 1
        do_start
        echo "."
        ;;
        status)
        status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
        *)
        echo "usage: $NAME {start|stop|restart}"
        exit 1
        ;;
    esac
    

    Make it belong to root, make it executable, and set it up to run on startup with:

    sudo chown root:root /etc/init.d/my-java-app
    sudo chmod 755 /etc/init.d/my-java-app
    sudo update-rc.d my-java-app defaults
    

    To start the service you can run:

    sudo service my-java-app start
    

    To stop the service you can run:

    sudo service my-java-app stop
    

    This is based on a simplified version of the /etc/init.d/skeleton file included by Ubuntu.

    The man page for start-stop-daemon is worth looking at if you want to tweak this further.b