9

我有玩应用程序,以便在 Debian 上轻松部署,有什么方法可以

  1. 从代码中创建一个守护进程,使用标准的 init.d 脚本,这里的主要问题是如何优雅地停止应用程序?

  2. 如何将代码编译为胖 jar,与多个文件和目录(部署 Play 应用程序的标准方式)相比,易于维护 1 个单个文件。

4

2 回答 2

9
  1. 假设您使用的是“play dist”包,您可以围绕它创建一个简单的 init.d 脚本。就像是:

/etc/init.d/play.myplayapp

    #! /bin/sh

    ### BEGIN INIT INFO
    # Provides:          play
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description:
    # Description:
    ### END INIT INFO

    APP="myplayapp"
    APP_PATH="/opt/play/$APP"

    start() {
        $APP_PATH/start &
    }

    stop() {
        kill `cat $APP_PATH/RUNNING_PID`
    }

    case "$1" in
      start)
        echo "Starting $APP"
        start
        echo "$APP started."
        ;;
      stop)
        echo "Stopping $APP"
        stop
        echo "$APP stopped."
        ;;
      restart)
        echo  "Restarting $APP."
        stop
        sleep 2
        start
        echo "$APP restarted."
        ;;
      *)
        N=/etc/init.d/play.$APP
        echo "Usage: $N {start|stop|restart}" >&2
        exit 1
        ;;
    esac

    exit 0

2. 他们并没有真正的项目文件分布。你能做的最好的就是运行“play dist”来生成一个可分发的包。即使它是作为单个文件分发的,它也可能会在运行时被提取到文件系统中,只是为了提高效率(就像处理 war 文件的方式一样)。

于 2012-03-24T05:52:54.167 回答
0

我准备了与 play 2.2.x 包兼容的新版本脚本:

https://github.com/mgosk/play-app-deamon

 #! /bin/sh

    ### BEGIN INIT INFO
    # Provides:          play
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description:
    # Description:
    ### END INIT INFO

    # configurable variables
    APP_NAME="myplayapp"
    APP_DIR="/opt/myplayapp"
    CONF="application.conf"

    # private variables
    APP_SCRIPT="$APP_DIR/bin/$APP_NAME"
    PID_FILE="/var/run/$APP_NAME.pid"
    CONF_FILE="$APP_DIR/conf/$CONF"

    start() {
         $APP_SCRIPT -Dpidfile.path=$PID_FILE -Dconfig.file=$CONF_FILE  > /dev/null &
    }

    stop() {
        kill `cat $PID_FILE`
    }

    case "$1" in
      start)
        echo "Starting $APP_NAME"
        if [ -e "$PID_FILE" ] ; then
                echo "$APP_NAME already running"
                echo "Try restart option or delete pid file at $PID_FILE"
        else
                start
                echo "$APP_NAME started"
        fi
        ;;
      stop)
        echo "Stopping $APP_NAME"
        stop
        echo "$APP_NAME stopped."
        ;;
      restart)
        echo  "Restarting $APP_NAME"
        stop
        sleep 2
        start
        echo "$APP_NAME restarted."
        ;;
      status)
        if [ -e "$PID_FILE" ] ; then
                echo "$APP_NAME is running (pid `cat $PID_FILE`)"
        else
                echo "$APP_NAME is not running"
        fi
        ;;
      *)
        N="/etc/init.d/$APP_NAME"
        echo "Usage: $N {start|stop|restart|status}" >&2
        exit 1
        ;;
    esac

    exit 0
于 2014-04-29T23:36:34.513 回答