我的Java应用程序有两个要求。如果它死了,重新启动它。如果服务器重新启动,请重新启动它 - 这很简单。使用答案here我有一个脚本将在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 start时,脚本启动但挂起控制台。我试过“daemon --user appuser nohup $ MYAPP&”并且我立即返回到没有任何[OK]指示的提示,当我执行ps时,我仍然看到init挂起。任何想法如何在init脚本中调用脚本并使其正确返回?
谢谢,
格雷格
答案 0 :(得分:8)
我的机器上的守护进程函数(旧的RedHat)在执行的程序返回之前不会返回。因此,您需要让您的小实用程序脚本执行分叉。
尝试编写这样的实用程序:
#!/bin/bash
(
until java -Xms256m -Xmx768m -jar MyApp.jar; do
echo "MyApp crashed with exit code $?. Respawning... " >&2
sleep 5
done
) &
这是如何运作的。将命令放在括号中会启动在新进程中运行的代码。您将进程置于后台,以便原始进程无需等待即可返回。
答案 1 :(得分:4)
你需要一个java服务包装器,这是一个非常好的... tanuki
我的意思是说,你不需要重新发明轮子,那里有工具..