2010-02-05 57 views
3

我对我的Java应用程序有两个要求。如果它死了,重新启动它。如果服务器重新启动,重新启动它 - 很简单。使用答案here我有一个脚本,将在Java应用程序死亡时重新启动。在启动时启动java进程并在死时自动重启

 
#!/bin/bash 

until java -Xms256m -Xmx768m -jar MyApp.jar; do 
    echo "MyApp crashed with exit code $?. Respawning... " >&2 
    sleep 5 
done 

我可以用“nohup的restart_script.sh &”运行这个长将全天运行没有问题。现在为启动要求。我使用/etc/init.d/crond脚本并用脚本替换了crond二进制文件,但它在启动时挂起。

 
#!/bin/bash 
# 
# Init file for my application. 
# 
. /etc/init.d/functions 

MYAPP=restart_script.sh 
PID_FILE=/var/run/myapp.pid 

start(){ 
     echo -n "Starting My App" 
     daemon --user appuser $MYAPP 
     RETVAL=$? 
     echo 
     [ $RETVAL -eq 0 ] && touch /var/lock/subsys/myapp 
     return $RETVAL 
} 

stop(){ 
     echo -n "Stopping my application" 
     killproc $MYAPP 
     RETVAL=$? 
     echo 
     [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/myapp 
     return $RETVAL 
} 

... 

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

当我运行/ sbin/service myapp启动脚本启动但挂起控制台。我已经尝试了“守护进程 - 用户appuser nohup $ MYAPP &”,我立即返回提示,没有任何[OK]指示,当我执行ps时,我仍然看到init被挂起。任何想法如何在初始化脚本中调用脚本并使其正确返回?

感谢,

格雷格

+0

这可能更适合http://superuser.com。 – danben 2010-02-05 18:49:35

回答

5

我的机器上的守护进程功能(旧的RedHat)不会返回,直到执行的程序返回。所以你将需要让你的小实用程序脚本做分叉。

试着写你的程序是这样的:

#!/bin/bash 

(
    until java -Xms256m -Xmx768m -jar MyApp.jar; do 
     echo "MyApp crashed with exit code $?. Respawning... " >&2 
     sleep 5 
    done 
) & 

如何工作的。将命令放在括号中会启动代码在新进程中运行。您将进程置于后台,以便原始进程无需等待即可返回。

4

你需要一个Java服务包装,这里是一个很好的一个... tanuki
我的意思是说,你不需要推倒重来,有是那里的工具..

+0

+1使用已存在的解决方案 – 2010-02-05 22:26:49

+0

抱歉,不能使用不兼容的许可证。 – GregB 2010-02-11 18:22:44