Gre*_*egB 6 java linux bash init.d
我的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 start时脚本启动但挂起控制台.我尝试了"守护进程--user appuser nohup $ MYAPP&",我立即返回到没有任何[OK]指示的提示,当我做ps时,我仍然看到init挂了.任何想法如何在init脚本中调用脚本并让它正确返回?
谢谢,
格雷格
我的机器上的守护进程函数(旧的RedHat)在执行的程序返回之前不会返回.因此,您需要让您的小实用程序脚本执行分叉.
尝试像这样写你的实用程序:
#!/bin/bash
(
until java -Xms256m -Xmx768m -jar MyApp.jar; do
echo "MyApp crashed with exit code $?. Respawning... " >&2
sleep 5
done
) &
Run Code Online (Sandbox Code Playgroud)
这是如何工作的.将命令放在括号中会启动在新进程中运行的代码.您将进程置于后台,以便原始进程将返回而不等待它.