How to write Gradle startup script
Asked Answered
V

1

1

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!

Vercelli answered 4/9, 2013 at 16:38 Comment(0)
B
9

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
Benjaminbenji answered 4/9, 2013 at 18:9 Comment(1)
Very thorough answer, thank you! I wound up going with a simple daemon execution ./gradlew run &, but your answer is exactly what I need. I'll go back and set it up correctly.Vercelli

© 2022 - 2024 — McMap. All rights reserved.