Search code examples
gradlestartupupstartgradlew

How to write Gradle startup script


I have a Gradle app that I startup using ./gradlew run. This works fine, but I'm trying to deploy to an AWS instance (Ubuntu 12) and I would like the script to execute on boot. I tried writing a startup.sh file with the above command, but no dice. I've also tried adding the command to the /etc/rc.local file, but that doesn't seem to work either. Can someone give me an idea as to how to execute `./gradlew run' on startup? Thanks!


Solution

  • I wrote the following init script for starting gradle applications at system startup for redhat distros (centos/fedora etc).

    You need to perform a few steps to tie it all together:

    1. deploy your gradle application using gradle distZip onto your target server
    2. create a configuration file /etc/my-service.conf
    3. link the init script (see below) to the service name in /etc/init.d/my-service

    An example configuration file /etc/my-service.conf

    username=someunixuser
    serviceName=MyStandaloneServer
    prog="/path/to/bin/MyStandaloneServer -a any -p params -y you -w want"
    javaClass="some.java.MyStandaloneServer"
    

    Note the path to the application from the distZip in the prog line.

    You then link the init script to the actual service you want it to be run as, e.g.

    ln -s /path/to/gradle-init-start-stop /etc/init.d/my-service
    

    Once you've done this, you can use chkconfig to add the service in the usual way (it defaults to 3/4/5)

    Here is the script gradle-init-start-stop

    #!/bin/bash
    #
    # chkconfig: 345 80 20
    # description: Start and stop script for gradle created java application startup
    #
    # This is a generic file that can be used by any distribution from gradle ("gradle distZip").
    # Link this file to the name of the process you want to run.
    # e.g.
    #   ln -s /path/to/gradle-init-start-stop /etc/init.d/ivy-jetty
    #
    # it requires a conf file /etc/NAME.conf, e.g. /etc/ivy-jetty.conf
    # otherwise it will quit.
    #
    # CONFIGURATION FILE ENTRIES:
    # ---------------------------
    # username=process-owner
    # prog="/path/to/gradle-startscript -a any -e extra parameters"
    # serviceName=SomeShortNameForService
    # javaClass=package.for.JavaClass
    
    . /etc/rc.d/init.d/functions
    
    BASENAME=$(basename $0)
    maxShutdownTime=15
    
    CONF=/etc/${BASENAME}.conf
    pidfile=/var/run/$BASENAME.pid
    
    if [ ! -f $CONF ] ; then
      echo "Could not find configuration file: $CONF"
      exit 1
    fi
    
    ####### SOURCE CONFIGURATION FILE
    source $CONF
    
    checkProcessIsRunning() {
      local pid="$1"
      if [ -z "$pid" -o "$pid" == " " ]; then return 1; fi
      if [ ! -e /proc/$pid ]; then return 1; fi
      return 0
    }
    
    checkProcessIsOurService() {
      local pid="$1"
      if [ "$(ps -p $pid --no-headers -o comm)" != "java" ]; then return 1; fi
      grep -q --binary -F "$javaClass" /proc/$pid/cmdline
      if [ $? -ne 0 ]; then return 1; fi
      return 0
    }
    
    getServicePID() {
      if [ ! -f $pidfile ]; then return 1; fi
      pid="$(<$pidfile)"
      checkProcessIsRunning $pid || return 1
      checkProcessIsOurService $pid || return 1
      return 0
    }
    
    startService() {
      cmd="nohup $prog >/dev/null 2>&1 & echo \$!"
      sudo -u $username -H $SHELL -c "$cmd" > $pidfile
      sleep 0.2
      pid="$(<$pidfile)"
      if checkProcessIsRunning $pid; then
        return 0
      else
        return 1
      fi
    }
    
    start() {
      getServicePID
      if [ $? -eq 0 ]; then echo -n "$serviceName is already running"; RETVAL=0; echo ""; return 0; fi
    
      echo -n "Starting $serviceName: "
      startService
      if [ $? -ne 0 ] ; then
        echo "failed"
        return 1
      else
        echo "started"
        return 0
      fi
    }
    
    stopService() {
      # soft kill first...
      kill $pid || return 1
    
      # check if process dead, sleep 0.2s otherwise
      for ((i=0; i<maxShutdownTime*5; i++)); do
        checkProcessIsRunning $pid
        if [ $? -ne 0 ] ; then
          rm -f $pidfile
          return 0
        fi
        sleep 0.2
      done
    
      # hard kill now...
      kill -s KILL $pid || return 1
    
      # check if process dead, sleep 0.2s otherwise
      for ((i=0; i<maxShutdownTime*5; i++)); do
        checkProcessIsRunning $pid
        if [ $? -ne 0 ] ; then
          rm -f $pidfile
          return 0
        fi
        sleep 0.2
      done
      return 1
    }
    
    stop() {
      getServicePID
      if [ $? -ne 0 ]; then echo -n "$serviceName is not running"; RETVAL=0; echo ""; return 0; fi
      pid="$(<$pidfile)"
    
      echo -n "Stopping $serviceName "
      stopService
      if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
      echo "stopped PID=$pid"
      RETVAL=0
      return 0
    }
    
    restart() {
      stop
      start
    }
    
    checkServiceStatus() {
      echo -n "Checking for $serviceName:   "
      if getServicePID; then
        echo "running PID=$pid"
        RETVAL=0
      else
        echo "stopped"
        RETVAL=3
      fi
      return 0;
    }
    
    
    ####### START OF MAIN SCRIPT
    
    RETVAL=0
    case "$1" in
      start)
        $1
        ;;
      stop)
        $1
        ;;
      restart)
        $1
        ;;
      status)
        checkServiceStatus
        ;;
      *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
    esac
    exit $RETVAL