【问题标题】:How to write Gradle startup script如何编写 Gradle 启动脚本
【发布时间】:2013-09-08 06:53:10
【问题描述】:

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

【问题讨论】:

    标签: gradle startup upstart gradlew


    【解决方案1】:

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

    您需要执行几个步骤来将它们联系在一起:

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

    【讨论】:

    • 非常详尽的回答,谢谢!我结束了一个简单的守护进程执行./gradlew run &amp;,但你的答案正是我所需要的。我会回去正确设置。
    • @MichaelDJohnson 很高兴我能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多