2013-01-02 57 views
1

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

脚本:

#! /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,但他们使用的是 启动 - 停止 - 守护,我不会对我的红帽企业Linux服务器发行版5.6(Tikanga) dist。如果可能的话,我宁愿不安装任何其他软件来完成此项工作。我错过了什么让这项工作作为后台任务并将其从控制台中分离出来? CTRL + D不起作用,CTRL + C退出该过程。

+0

在这些行中的东西? https://gist.github.com/2173037 – favoretti

+0

你好,谢谢。你指出我正确的方向。我在没有守护进程的情况下解决了这个问题,但解决方案并不完美,因为您需要将CTRL + D从控制台中移出。但应用程序启动和停止=)也许别人有更好的? – jakob

+0

你想要什么是你的程序是一个守护进程。这意味着程序在执行时执行'fork()',断开stdin和stdout,然后一个fork退出,另一个fork继续运行,而不是连接到任何终端。通常,这是通过运行程序来实现的,而不是由init.d脚本实现的。不幸的是,我不知道如何用Java编写守护进程,但这可能更像是你应该问的问题。 –

回答

1

确定这里是favoretti提示后一种解决方案:

#! /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走出这不正是我心目中的控制台。也许有人在那里有更好的解决方案?

+0

或CTRL + C,两者都可以工作 – jakob

0

这是我的版本,可以在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 
相关问题