【发布时间】: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