首页 文章

在启动时启动java进程并在死机时自动重启

提问于
浏览
4

我的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时脚本启动但挂起控制台 . 我尝试了“守护进程--user appuser nohup $ MYAPP&”,我立即返回到没有任何[OK]指示的提示,当我做ps时,我仍然看到init挂了 . 任何想法如何在init脚本中调用脚本并让它正确返回?

谢谢,

格雷格

2 回答

  • 4

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

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

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

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

  • 8

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

相关问题