【问题标题】:Start play2 application as a background task with daemon使用守护进程将 play2 应用程序作为后台任务启动
【发布时间】:2012-12-16 17:12:33
【问题描述】:

我一直在尝试为我的 play2 应用程序编写启动脚本,但我无法让它作为后台任务工作。我从docs 开始,并想出了下面的脚本。

脚本:

#! /bin/sh

# description: Starts autocomplete play app using daemon
# 1. Go to $APPLICATION_PATH and prepare for dev by doing: play clean compile stage
#    This will create a start script at target/start
# 2. Start the application by running this script

. /etc/rc.d/init.d/functions

PLAY_HOME=/opt/play
PLAY=$PLAY_HOME/play
NAME=autocomplete
DESC="autocomplete application"
PID_FILE=/var/run/autocomplete/$NAME.pid    

# Path to the JVM
JAVA_HOME=/usr/java/latest
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin

APPLICATION_PATH=/opt/playapps/autocomplete

DAEMON_OPTS="-Dconfig.file=/opt/playapps/autocomplete/conf/application-dev.conf"

start()
{
    echo -n "Starting $DESC with: --pidfile $PID_FILE ${APPLICATION_PATH}/target/start $DAEMON_OPTS"
    daemon --pidfile $PID_FILE "${APPLICATION_PATH}/target/start $DAEMON_OPTS"
}
stop()
{
  echo -n $"Stopping $DESC:"
  #NOT DONE YET
}


case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
esac

exit $RETVAL

我用谷歌搜索了这个问题并找到了像this 这样的解决方案,但他们正在使用 start-stop-daemon 我的 Red Hat Enterprise Linux Server 5.6 (Tikanga) dist 中没有。如果可能的话,我宁愿不安装任何其他软件来完成这项工作。为了使这项工作作为后台任务并将其与控制台分离,我错过了什么? CTRL+D 不起作用,CTRL+C 退出进程。

【问题讨论】:

  • 这几行有什么? gist.github.com/2173037
  • 您好,谢谢。你为我指明了正确的方向。我在没有守护进程的情况下解决了它,但解决方案并不完美,因为您需要 CTRL+D 退出控制台。但是应用程序启动和停止 =) 也许其他人有更好的?
  • 你想要你的程序成为一个守护进程。这意味着程序在执行时会执行fork(),断开标准输入和标准输出,然后一个分支退出,而另一个分支继续运行,不连接到任何终端。通常,这是通过正在运行的程序而不是 init.d 脚本来实现的。不幸的是,我不知道如何用 Java 编写守护程序,但这可能是您应该问的更多问题。

标签: bash playframework-2.0 daemon init.d


【解决方案1】:

好的,这里是来自 favouretti 提示的一种解决方案:

#! /bin/sh

# description: Starts autocomplete play app using daemon
# 1. Go to $APPLICATION_PATH and prepare for dev by doing: play clean compile stage
#    This will create a start script at target/start
# 2. Start the application by running this script
# created by: Jakob

. /etc/rc.d/init.d/functions

PLAY_HOME=/opt/play
PLAY=$PLAY_HOME/play
NAME=autocomplete
DESC="autocomplete application"

# Path to the JVM
JAVA_HOME=/usr/java/latest
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin

APPLICATION_PATH=/opt/playapps/autocomplete

DAEMON_OPTS="-Dconfig.file=/opt/playapps/autocomplete/conf/application-dev.conf"

start()
{
        echo -n "Starting $DESC with: $APPLICATION_PATH/target/start $DAEMON_OPTS &"
        $APPLICATION_PATH/target/start $DAEMON_OPTS &
}
stop()
{
        echo -n $"Stopping $DESC:"
        kill `cat $APPLICATION_PATH/RUNNING_PID`
}


case "$1" in
  start)
    start
    ;;
  stop)
        stop
        ;;
esac

exit $RETVAL

您需要 CTRL+D 才能退出控制台,这与我的想法不完全一致。也许有人有更好的解决方案?

【讨论】:

    【解决方案2】:

    这是我在 Amazon AMI Linux 下自动启动 play 2.2 应用程序的版本。在 CentOS 和 RedHat 下也是如此。其他 linux 风格可能需要很少的适应。该脚本在单独的用户下启动播放应用程序。

    #!/bin/bash
    # description: MyWorkCalendar Play App
    # processname: myworkcalendar
    # chkconfig: 234 20 80
    
    # User running the Play process
    USER=mywork
    USER_HOME=/home/mywork
    
    # Java home, add java and play to path
    export JAVA_HOME=$USER_HOME/java_home
    export PATH=$JAVA_HOME/bin:$USER_HOME/play_home:$PATH
    
    # Path to the application
    APP_PATH=$USER_HOME/app/work-calendar/target/universal/stage
    APP_OPTS="-Dconfig.file=$APP_PATH/conf/application-prod.conf"
    
    RETVAL=0
    
    case "$1" in
      start)
        echo -n "Starting Play service"
        rm -f ${APP_PATH}/RUNNING_PID
        su $USER -c "$APP_PATH/bin/myworkcalendar $APP_OPTS >/dev/null" &
        RETVAL=$?
        ;;
      stop)
        echo -n "Shutting down Play service"
        kill `cat $APP_PATH/RUNNING_PID`
        RETVAL=$?
        ;;
    esac
    exit $RETVAL
    

    将脚本放到/etc/init.d,使其可执行并用chkconfig注册:

    sudo chmod 755 script-name
    sudo chkconfig --add script-name
    sudo chkconfig script-name on
    

    【讨论】:

      【解决方案3】:

      这是我的 Play 2.2 启动/停止脚本版本:

      http://vladsprogrammingblog.blogspot.com/2014/01/play-startstop-script.html

      【讨论】:

      • 你能找出问题中的脚本有什么问题吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多