Как написать Gradle startup script

У меня есть приложение Gradle, которое я запускаю с помощью ./gradlew run. Это отлично работает, но я пытаюсь развернуть экземпляр AWS (Ubuntu 12), и я бы хотел, чтобы script выполнялся при загрузке. Я попытался написать файл startup.sh с приведенной выше командой, но не кубиками. Я также попытался добавить команду в файл /etc/rc.local, но это тоже не работает. Может ли кто-нибудь дать мне представление о том, как выполнить запуск. /gradlew run при запуске? Спасибо!

Ответ 1

Я написал следующий init script для запуска приложений gradle при запуске системы для redhat distros (centos/fedora и т.д.).

Вам нужно выполнить несколько шагов, чтобы связать все это:

  • разверните приложение gradle с помощью gradle distZip на ваш целевой сервер
  • создать файл конфигурации /etc/my -service.conf
  • свяжите init script (см. ниже) с именем службы в /etc/init.d/my-service

Пример конфигурационного файла /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"

Обратите внимание на путь к приложению из distZip в строке prog.

Затем вы связываете init script с фактической службой, которую вы хотите запустить, например,

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

Как только вы это сделаете, вы можете использовать chkconfig для добавления службы обычным способом (по умолчанию она равна 3/4/5)

Вот 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