用于启动、停止、重启和检查应用程序的运行状态。
它首先定义了一些变量和 JVM 参数,然后根据用户输入的命令执行相应的函数。
- start() 函数启动应用程序,
- stop() 函数停止应用程序,
- restart() 函数停止并重新启动应用程序,
- status() 函数检查应用程序的运行状态
#!/bin/bash
AppName=AppName.jar
APP_HOME=$(pwd)/$AppName
#JVM参数
# -Xms:指定jvm堆的初始大小,默认为物理内存的1/64;可以指定单位,比如k、m,若不指定,则默认为字节。
# -Xmx:指定jvm堆的最大值,默认为物理内存的1/4,单位与-Xms一致;在开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
# -XX:NewSize: 设置新生代对象能占用内存够的初始大小
# -XX:MaxNewSize: 设置新生代能占用内存的最大值;这个值应该小于 -Xmx的值
# -XX:SurvivorRatio: 新生代中survivor区和eden区的比例
# -XX:NewRatio: 新生代内存容量与老生代内存容量的比例
# -XX:PermSize: 表示非堆区初始内存分配大小
# -XX:MaxPermSize:非堆区分配的内存的最大上限
# -XX:+HeapDumpOnOutOfMemoryError: 当首次遭遇OOM(OutOfMemoryError)时导出此时堆中相关信息
# -XX:+PrintGCDateStamps: 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
# -XX:+PrintGCDetails: 输出详细GC日志
# -XX:+UseParallelGC: 启用并行GC
# -XX:+UseParallelOldGC: 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
# -Xss: 设置每个线程的堆栈大小
JVM_OPTS="$APP_HOME -Xms2G -Xmx2G -XX:PermSize=256M -XX:MaxPermSize=512M
-XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps
-XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=6 -XX:+UseConcMarkSweepGC"
if [ "$1" = "" ];
then
echo -e "Usage: {start|stop|restart|status}"
exit 1
fi
if [ "$AppName" = "" ];
then
echo -e "AppName required"
exit 1
fi
function start()
{
OLDPID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
if [ x"$OLDPID" != x"" ]; then
echo "$AppName is running..."
exit
else
# /dev/null 表示linux的空设备文件,所以往这个文件里面写入的内容都会丢失
# 1、标准输出到空设备文件,错误输出重用了标准输出的描述符,所以错误输出也到空设备文件中
nohup java -jar $JVM_OPTS > /dev/null 2>&1 &
# 2、标准输出和错误输出都写入到 app.log日志文件中
# nohup java -jar $JVM_OPTS > app.log 2>&1 &
# 3、标准输出写入到 app.log日志文件,错误输出写入到error.log中
# nohup java -jar $JVM_OPTS > app.log 2>error.log &
echo "Start $AppName ..."
fi
PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
if [ x"$PID" = x"" ]; then
echo "$AppName start fail"
exit
else
echo "$AppName start success"
fi
}
function stop()
{
echo "Stop $AppName"
PID=""
query(){
PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
}
query
if [ x"$PID" != x"" ]; then
kill -TERM $PID
echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ]
do
sleep 1
query
done
echo "$AppName exited."
else
echo "$AppName already stopped."
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
PID=$(ps -ef |grep java|grep $AppName|grep -v grep|wc -l)
if [ $PID != 0 ];then
echo "$AppName is running..."
else
echo "$AppName is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
esac
使用脚本时应该注意以下问题:
- 安全问题:确保脚本来源可信,不要运行未知来源的脚本,以免造成损失。
- 兼容性问题:脚本可能依赖于某些特定的软件或版本,需要先确认环境是否符合要求。
- 参数问题:根据脚本的说明,确保输入参数正确,避免出现错误。
- 文件权限问题:脚本可能需要访问或修改某些文件,需要确保文件的权限设置正确。
- 日志记录问题:脚本的输出可能会写入日志文件,需要关注日志文件的大小和内容,避免占用过多磁盘空间。
- 脚本可读性问题:脚本的可读性可能不太好,需要仔细研究代码,避免出现理解错误导致的问题。
本文暂时没有评论,来添加一个吧(●'◡'●)