Java会自己守护吗?

时间:2018-08-09 00:03:46

标签: java linux launching-application

我在由第三方编写的Java包装程序外壳脚本中包含以下代码:

TEMPFILE=$(mktemp java-wrapper-XXXXX)
"$@" | awk -v t=${TEMPFILE} '/unable to fund java heap account/ {print 1 > t} {print}'
RC=$?

if [ 0 -eq ${RC} -o ! -s ${TEMPFILE} ]; then
  exit
fi

$@应该包含java命令行以及参数。这里的逻辑是:

  • 在调用另一个脚本进行碎片整理后,如果由于堆问题而失败,请重新运行java命令
  • 什么也不做,让Java进程在后台运行,否则

"$@" | awk ...中,java在前台被调用。如果java成功引导,它会自己守护吗?这对我来说似乎没有任何意义。除非有内存问题,否则这段代码将导致java进程正常运行,其输出通过管道传输到awk,不是吗?

请帮助我理解这一点。我欢迎任何改进逻辑的建议。请忽略大写变量和可以通过shellcheck找到的其他问题。


这是完整的脚本:

#!/bin/bash

# Java Wrapper takes java command as input
# and runs java. If java fails due to zing memory
# it attempts to run get2Mpages.sh (az_fragger binary) for
# the given Xmx and them runs java again

set -o pipefail

BASE=$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)
NAME=$(basename "${BASH_SOURCE[0]}")

GET_2MPAGES=${BASE}/get2Mpages.sh

fail() {
   echo "ERROR: $@" >&2
   echo "Usage: $NAME java [<args>...] -XmxNNN [<args>...]" >&2
   exit 1
}

[ $# -gt 0 ] || fail "No command specified"

# extract the Xmx value
XMX=$(echo "$@" | sed -n 's/.*-Xmx\([0-9]*.\).*/\1/p')
[ -n "${XMX}" ] || fail "Unable to extract Xmx argument from the command-line"

trap on_exit SIGTERM SIGQUIT EXIT

on_exit() {
  rm -f "${TEMPFILE}"
  exit ${RC}
}

TEMPFILE=$(mktemp java-wrapper-XXXXX)

"$@" | awk -v t=${TEMPFILE} '/unable to fund java heap account/ {print 1 > t} {print}'
RC=$?

if [ 0 -eq ${RC} -o ! -s ${TEMPFILE} ]; then
  exit
fi

# OOM Detected
cat << EOF >&2
Info: Failed to run JAVA due to insufficient 2MB pages
Info: Now running $GET_2MPAGES ${XMX}
EOF

${GET_2MPAGES} ${XMX} && {
  echo "Info: attempting to run JAVA again" >&2
  echo
  "$@"
}
RC=$?

0 个答案:

没有答案