Skip to content

Instantly share code, notes, and snippets.

@anthavio
Last active January 14, 2016 13:09
Show Gist options
  • Save anthavio/2649639f3629f38e148e to your computer and use it in GitHub Desktop.
Save anthavio/2649639f3629f38e148e to your computer and use it in GitHub Desktop.
jstatd /etc/init.d script
#!/bin/sh
# chkconfig: 345 99 05
# description: Java jstatd utility
# Install
# /etc/init.d/jstatd
# chkconfig --add jstatd
# Optional variables:
# JAVA_HOME, JPS_BIN, JSTATD_BIN, JSTATD_PORT, POLICY_FILE
# JPS_APP_ID, JVM_START_LOG, START_TIMEOUT, STOP_TIMEOUT, TIME_STEP
DIRNAME=`dirname $0`
PROGNAME=`basename $0`
if [ "$JSTATD_PORT" == "" ]; then
JSTATD_PORT=1099
fi
if [ "$JSTATD_BIN" == "" ]; then
if [ "$JAVA_HOME" != "" ]; then
JSTATD_BIN=$JAVA_HOME/bin/jstatd
else
JSTATD_BIN=jstatd
fi
fi
if ! command -v ${JSTATD_BIN} >/dev/null 2>&1; then
echo "${JSTATD_BIN} not found or executable"
exit 1
fi
if [ "$JPS_BIN" == "" ]; then
if [ "$JAVA_HOME" != "" ]; then
JPS_BIN=$JAVA_HOME/bin/jps
else
JPS_BIN=jps
fi
fi
if ! command -v ${JPS_BIN} >/dev/null 2>&1; then
echo "${JPS_BIN} not found or executable"
exit 1
fi
if [ "$JPS_APP_ID" == "" ]; then
JPS_APP_ID=jstatd-jvm-${JSTATD_PORT}
fi
if [ "$START_TIMEOUT" == "" ]; then
START_TIMEOUT=2
fi
if [ "$STOP_TIMEOUT" == "" ]; then
STOP_TIMEOUT=2
fi
if [ "$TIME_STEP" == "" ]; then
TIME_STEP=1
fi
if [ "$JVM_START_LOG" == "" ]; then
JVM_START_LOG=${HOME}/jstatd.sysout
fi
if [ "$POLICY_FILE" == "" ]; then
POLICY_FILE=${HOME}/.jstatd.policy
fi
if [ ! -r ${POLICY_FILE} ]; then
cat >${POLICY_FILE} <<'EOF'
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
EOF
fi
JVM_START_CMD="${JSTATD_BIN} -J-DJPS_APP_ID=${JPS_APP_ID} -p $JSTATD_PORT -J-Djava.security.policy=${POLICY_FILE}"
die() {
echo "${PROGNAME}: $*" 2>&1
exit 1
}
doStart() {
isRunningJvm ${JPS_APP_ID}
if [ $? -eq 1 ]; then
echo "JVM ${JPS_APP_ID} is running with pid ${JVM_PID}"
return 1
fi
echo -ne "Starting JVM ${JPS_APP_ID} ..."
nohup $JVM_START_CMD > $JVM_START_LOG 2>&1 &
sleep $TIME_STEP
isRunningJvm ${JPS_APP_ID}
if [ $? -eq 0 ]; then
echo "[FAILED] Examine ${JVM_START_LOG} or application log"
exit 1
fi
TIME_LEFT=$START_TIMEOUT
while [ $TIME_LEFT -gt 0 ]
do
isRunningPid $JVM_PID
if [ $? -eq 0 ]; then
echo "[FAILED] Examine ${JVM_START_LOG} or application log"
exit 1
fi
echo -ne "."
sleep $TIME_STEP
let TIME_LEFT=$TIME_LEFT-$TIME_STEP
done
echo "[ OK ]"
return 0
}
doStop() {
isRunningJvm ${JPS_APP_ID}
if [ $? -eq 0 ]; then
echo "JVM ${JPS_APP_ID} is not running"
return 1
fi
echo -ne "Stopping JVM ${JPS_APP_ID} ..."
TIME_LEFT=$STOP_TIMEOUT
while [ $TIME_LEFT -gt 0 ]
do
kill $JVM_PID 2>/dev/null
isRunningPid $JVM_PID
if [ $? -eq 0 ]; then
break
fi
sleep $TIME_STEP
let TIME_LEFT=$TIME_LEFT-$TIME_STEP
echo -ne "."
done
if [ $TIME_LEFT -le 0 ]; then
kill -9 $JVM_PID 2>/dev/null
echo "JVM ${JPS_APP_ID} did not stop in $STOP_TIMEOUT seconds. It was killed by 9 SIGNAL though"
else
echo "[ OK ]"
fi
}
doKill() {
isRunningJvm ${JPS_APP_ID}
if [ $? -eq 0 ]; then
echo "JVM ${JPS_APP_ID} is not running"
return 1
fi
kill -9 ${JVM_PID}
}
doStatus() {
isRunningJvm ${JPS_APP_ID}
if [ $? -eq 0 ]; then
echo "JVM ${JPS_APP_ID} is not running"
return 1
else
echo "JVM ${JPS_APP_ID} is running with pid ${JVM_PID}"
return 0
fi
}
# return: 1 - running, 0 - NOT running
function isRunningJvm() {
getJvmPid $1
if [ "x${JVM_PID}" = "x" ]; then
return 0
else
return 1
fi
}
# return: 1 - IS running, 0 - NOT running
function isRunningPid() {
ps -p $1 >/dev/null 2>/dev/null || return 0
return 1
}
function getJvmPid() {
JVM_PID=`${JPS_BIN} -J-Xms8m -J-Xmx16m -mlv | grep "JPS_APP_ID=${1}" | cut -f 1 -d ' '`
return $JVM_PID
}
case "$1" in
"start"|"st")
doStart
;;
"stop"|"sp")
doStop
;;
"kill"|"kl")
doKill
;;
"status"|"ss")
doStatus
;;
"restart"|"rt")
doStop
sleep $TIME_STEP
doStart
;;
*)
echo "Usage: $0 {status|start|stop|restart}"
exit 1
;;
esac
@OleksandrKucherenko
Copy link

service jstatd start

will generate .jstatd.policy in the '/' folder... i think its better to use /usr/lib/jvm as a default location

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment