gradle - 如何编写Gradle启动脚本

标签 gradle startup upstart gradlew

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

最佳答案

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

您需要执行一些步骤来将它们 bundle 在一起:

  • 使用gradle distZip将gradle应用程序部署到目标服务器
  • 创建一个配置文件/etc/my-service.conf
  • 将初始化脚本(见下文)链接到/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"
    

    在prog行中,从distZip记录到应用程序的路径。

    然后,您将初始化脚本链接到您希望其运行的实际服务,例如
    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
    

    关于gradle - 如何编写Gradle启动脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619369/

    相关文章:

    gradle:禁止在多项目应用程序的根目录创建构建文件夹

    android-studio - 选择不同的库进行编译和运行时

    emacs - 如何在 Emacs 启动时显示自定义议程 View ?

    gcc - 理解 __libc_init_array

    python - 异步运行一些 Python 代码的正确方法是什么?

    linux - 如何在linux后台自动启动和推进应用程序中的几个步骤?

    django - Ubuntu 服务 Upstart 或 SystemD,Django 开发服务器即服务

    java - 运行服务器时出现 BeanCreationException

    android - Gradle 发布到 Artifactory 的特定仓库

    meteor - 减少 meteor 应用程序的初始启动时间