如何编写Gradle启动脚本

时间:2013-09-04 16:38:22

标签: gradle startup upstart gradlew

我有一个使用./gradlew run启动的Gradle应用。这工作正常,但我正在尝试部署到AWS实例(Ubuntu 12),我希望脚本在启动时执行。我尝试使用上面的命令编写一个startup.sh文件,但没有骰子。我也尝试将命令添加到/etc/rc.local文件中,但这似乎也不起作用。有人可以告诉我如何在启动时执行`./gradlew run'吗?谢谢!

1 个答案:

答案 0 :(得分:7)

我编写了以下初始化脚本,用于在系统启动时为redhat发行版(centos / fedora等)启动gradle应用程序。

您需要执行几个步骤将它们组合在一起:

  1. 使用gradle distZip将您的gradle应用程序部署到目标服务器
  2. 创建配置文件/etc/my-service.conf
  3. 将init脚本(见下文)链接到/etc/init.d/my-service中的服务名称
  4. 示例配置文件/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"
    

    请注意prog线中distZip的应用程序路径。

    然后将init脚本链接到您希望它运行的实际服务,例如

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

    完成此操作后,您可以使用chkconfig以常规方式添加服务(默认为3/4/5)

    这是脚本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