【问题标题】:Start java process at boot and auto-restart on death在启动时启动 java 进程并在死亡时自动重启
【发布时间】:2011-01-13 15:34:48
【问题描述】:

我对我的 Java 应用程序有两个要求。如果它死了,请重新启动它。如果服务器重新启动,请重新启动它 - 很简单。使用答案here 我有一个脚本,当 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 ] && 触摸 /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 挂起。任何想法如何在初始化脚本中调用脚本并让它正确返回?

谢谢,

格雷格

【问题讨论】:

标签: java linux bash init.d


【解决方案1】:

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

【讨论】:

  • 抱歉不能使用,许可证不兼容。
【解决方案2】:

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

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

#!/bin/bash

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

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

【讨论】: