6

我的 Java 应用程序有两个要求。如果它死了,请重新启动它。如果服务器重新启动,请重新启动它 - 很简单。使用此处的答案,我有一个脚本,该脚本将在 java 应用程序终止时重新启动。

#!/bin/bash

直到 java -Xms256m -Xmx768m -jar MyApp.jar;做
    echo "MyApp 崩溃,退出代码 $?. Respawning..." >&2
    睡觉 5
完毕

我可以用“nohup restart_script.sh &”运行它,它会运行一整天而不会出现问题。现在是启动要求。我使用 /etc/init.d/crond 脚本并用我的脚本替换了 crond 二进制文件,但它在启动时挂起。

#!/bin/bash
#
# 我的应用程序的初始化文件。
#
. /etc/init.d/functions

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

开始(){
        echo -n "启动我的应用程序"
        守护进程 --user appuser $MYAPP
        RETVAL=$?
        回声
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/myapp
        返回 $RETVAL
}

停止(){
        echo -n "停止我的应用程序"
        杀进程 $MYAPP
        RETVAL=$?
        回声
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/myapp
        返回 $RETVAL
}

...

案例“$1”在
    开始)
        开始
        ;;
    停止)
        停止
        ;;
...
经社理事会

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

谢谢,

格雷格

4

2 回答 2

10

我的机器(旧 RedHat)上的守护程序函数在执行的程序返回之前不会返回。因此,您将需要让您的小实用程序脚本进行分叉。

尝试像这样编写您的实用程序:

#!/bin/bash

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

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

于 2010-02-05T19:20:47.193 回答
4

您需要一个 java 服务包装器,这是一个非常好的... tanuki
我的意思是说,您不需要重新发明轮子,那里有工具..

于 2010-02-05T19:03:49.727 回答