启停java程序,Linux系统运维是不可缺少的工作。自己写一个启停程序很麻烦,有些方面考虑不足,可能会碰到一些bug,比如本来想要停止指定java程序,但是把其他java程序也停止了,所以这里写一个通用的生产java程序,供大家参考学习。
修改此脚本需要有SHELL高级变量和AWK的知识。如果有不懂的,可以留言作者。
#!/bin/bash
source /etc/profile
source /etc/bashrc
OPER=$1
SHELL_PATH=$(cd "$(dirname $0)";pwd)
APP_PATH=${SHELL_PATH%/*}
#这里可替换为你自己的执行程序,还有启动参数
APP_NAME=zdycx-0.0.1-SNAPSHOT.jar
JAVA_OPTS='-Xms2G -Xmx2G'
#这里可以指定log日志文件,或者指向空设备
APP_LOG=/dev/null
#使用说明,用来提示输入参数
usage() {
BASENAME=$(basename "$0")
echo "Usage: ${BASENAME} [start|stop|restart|status]"
exit 1
}
#获取进程PID
get_pid(){
PIDS=`jps -l |awk -v APP_NAME=${APP_NAME} '{if($2~APP_NAME)print $2}'`
PID_COUNTS=$(echo ${PIDS} | awk '{print NF}')
#如果不存在返回1,存在返回0
if [[ ${PID_COUNTS} -gt 1 ]]; then
echo "Error, Multiple processes found"
exit 0
fi
}
#启动方法
start_app(){
get_pid
if [ -n "$PIDS" ]; then
echo "${APP_NAME} is already running. pid=${PIDS} ."
else
echo "starting ${APP_NAME} ..."
nohup java $JAVA_OPTS -jar ${APP_PATH}/$APP_NAME 2>&1 &
fi
}
#停止方法
stop_app(){
get_pid
if [ -z "$PIDS" ]; then
echo "${APP_NAME} is not started!"
else
echo "stopping #APP_NAME ..."
kill $PIDS
fi
}
#输出运行状态
status_app(){
get_pid
if [[ ${PIDS} -eq 0 ]]; then
echo ">>>${APP_NAME} is NOT running."
else
echo ">>>${APP_NAME} is running. Pid is ${PIDS}"
fi
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$OPER" in
"start")
start_app
;;
"stop")
stop_app
;;
"status")
status_app
;;
"restart")
stop_app
sleep 2
start_app
;;
*)
usage
;;
esac