`
kevinflynn
  • 浏览: 41972 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

启动java的shell脚本

阅读更多

一个netty tcp长连接的项目中用到的启动脚本(脚本非原创,网上拷贝来拷贝去的,已不知出处),以及jvm一些参数的设置,记录下来以后应该还用得到

#!/bin/bash

# JDK所在路径
JAVA_HOME="/opt/java"

# 需要启动的Java主程序(main方法类)
APP_MAINCLASS="XXX"

# 拼凑完整的classpath参数,包括指定lib目录下所有的jar
CLASSPATH="."
for i in ../lib/*.jar; do
	CLASSPATH="$CLASSPATH":"$i"
done

# java虚拟机启动参数
# =======================================================================
# -XX:+<option> 开启option参数
# -XX:-<option> 关闭option参数
# -XX:<option>=<value> 将option参数的值设置为value
# =======================================================================
# -Duser.timezone=GMT+08 | 东八区
# -Xms6144m -Xmx6144m | 堆内存设置为6G,并禁止扩展
# -Xmn1536m | 堆内存(6G)中的1.5G分配给新生代,新生代太大会影响gc停顿时间,并且netty tcp长连接保存在老年代里
# -XX:PermSize=288m -XX:MaxPermSize=288m | 永久代固定为288m
# 剩下的就是老年代了 (堆内存size = 新生代size + 老年代size + 永久代size)
# -XX:UseConcMarkSweepGC | 使用ParNew + CMS + Serial Old的收集器组合进行内存回收。如果CMS出现Concurrent Mode Failure,则Serial Old作为后备
# -XX:+CMSClassUnloadingEnabled | 配合UseConcMarkSweepGC选项在jdk1.6中可实现对永久代(PermGen)的GC
# -XX:MaxTenuringThreshold | 晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC后年龄就+1
# -Xloggc:/opt/gc.log
# -XX:+PrintGCDetails | 打印GC详细信息
# -XX:+PrintGCTimeStamps | 打印GC停顿时间
# -XX:+HeapDumpOnOutOfMemoryError | 在发生内存溢出异常时生成堆转储快照
# -XX:HeapDumpPath=/opt/dump/ | 生成堆转储快照的目录
JAVA_OPTS="-Duser.timezone=GMT+08 -Xms6144m -Xmx6144m -Xmn1536m -XX:PermSize=288m -XX:MaxPermSize=288m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxTenuringThreshold=15 -Xloggc:/opt/gc.log  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump/"

# 初始化psid变量(全局)
psid=0

###################################
# (函数)判断程序是否已启动
#
# 说明:
# 使用JDK自带的JPS命令及grep命令组合,准确查找pid
# jps 加 l 参数,表示显示java的完整包路径
# 使用awk,分割出pid ($1部分),及Java程序名称($2部分)
###################################
checkpid() {
	javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`
	if [ -n "$javaps" ]; then
		psid=`echo $javaps | awk '{print $1}'`
	else
		psid=0
	fi
}

###################################
# (函数)启动程序
#
# 说明:
# 1.首先调用checkpid函数,刷新$psid全局变量
# 2.如果程序已经启动($psid不等于0),则提示程序已启动
# 3.如果程序没有被启动,则执行启动命令行
# 4.启动命令执行后,再次调用checkpid函数
# 5.如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
# 注意:echo -n 表示打印字符后,不换行
# 注意:"nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
start() {
	checkpid
	if [ $psid -ne 0 ]; then
		echo "================================"
		echo "warn: $APP_MAINCLASS already started! (pid=$psid)"
		echo "================================"
	else
		echo -n "Starting $APP_MAINCLASS ..."
#log.log要新建,用于存储日志文件
		nohup java $JAVA_OPTS -classpath $CLASSPATH "com.futurefleet.framework.bootstrap.main" > /data/software/log.log
		checkpid
		if [ $psid -ne 0 ]; then
			echo "(pid=$psid) [OK]"
		else
			echo "[Failed]"
		fi
	fi
}

###################################
#(函数)停止程序
#
#说明:
# 1.首先调用checkpid函数,刷新$psid全局变量
# 2.如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
# 3.使用kill -9 pid命令进行强制杀死进程
# 4.执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
# 5.如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
# 6.为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
#注意:echo -n 表示打印字符后,不换行
#注意:在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
stop() {
	checkpid
	if [ $psid -ne 0 ]; then
		echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
		kill -9 $psid
		if [ $? -eq 0 ]; then
			echo "[OK]"
		else
			echo "[Failed]"
		fi

		checkpid
		if [ $psid -ne 0 ]; then
			stop
		fi
	else
		echo "================================"
		echo "warn: $APP_MAINCLASS is not running"
		echo "================================"
	fi
}

###################################
#(函数)堆转储快照
#
#说明:
# 1.首先调用checkpid函数,刷新$psid全局变量
# 2.如果程序已经启动($psid不等于0),则开始执行jmap,否则,提示程序未运行
#注意:echo -n 表示打印字符后,不换行
#注意:在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
dump() {
	checkpid
	if [ $psid -ne 0 ]; then
		echo -n "Dumping $APP_MAINCLASS ...(pid=$psid) "
		jmap -dump:live,format=b,file=heep.bin $psid
	else
		echo "================================"
		echo "warn: $APP_MAINCLASS is not running"
		echo "================================"
	fi
}

###################################
#读取脚本的第一个参数($1),进行判断
###################################
case $1 in
start)
	echo "start project......"
	start
	;;
stop)
	echo "stop project......"
	stop
	;;
restart)
	echo "restart project......"
	stop
	start
	;;
dump)
	echo "dump project......"
	dump
	;;
*)
esac
exit 0

 

 

分享到:
评论

相关推荐

    shell脚本启动Java程序测试工程

    当涉及到启动Java应用程序时,shell脚本可以提供一个方便、可重复且灵活的方法。下面我们将深入探讨如何使用shell脚本来启动Java程序以及相关的知识点。 首先,我们需要了解Java程序的运行方式。Java应用程序通常由...

    linux shell脚本启动java类

    详细的linux shell脚本启动java代码类。

    centos7下启动springboot项目启动脚本(shell脚本)

    前言:打包好的springboot项目,可以使用java -jar xxx.jar的方式启动。当出现多个springboot项目需要启动的时候,可以使用脚本启动的方式。这在springcloud项目的开发测试阶段尤为有用。以下展示启动脚本示例,过程...

    linux系统java服务自启动shell脚本及服务cpu内存占用监控脚本

    自启动脚本主要目的是在Linux系统启动时自动启动Java服务,确保服务的高可用性。创建自启动脚本通常包括以下步骤: 1. 创建shell脚本:在系统的`/etc/init.d/`目录下创建一个名为`myjavaservice`的shell脚本,例如...

    shell,bat脚本运行java程序

    下面将详细介绍如何使用shell脚本(适用于Unix/Linux系统)和bat脚本(适用于Windows系统)来运行Java程序。 **shell脚本运行Java程序** 在Unix/Linux环境中,我们可以创建一个.sh文件作为shell脚本来执行Java程序...

    java在win下启动bat和在linux下启动shell脚本

    Java编程语言具有跨平台的能力,这使得它在各种操作系统上都能运行。在Windows和Linux环境中,启动批处理脚本(bat)...通过这种方式,开发者可以在Java程序中灵活地调用操作系统级别的功能,实现更复杂的自动化流程。

    重启java程序shell脚本

    linux中java项目需要重启一般使用先找到进程杀掉进程,然后找到项目启动,整个过程不算复杂,但是每次都操作一遍太麻烦,我这里把这个过程整理成shell脚本,大家可以修改里面项目名称,每次直接执行这个命令重启项目...

    Shell脚本中获取进程ID的方法

    当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...

    Shell脚本通过Java class文件启停Java程序源码(脚本及源码)

    在开发过程中经常会员到在Linux环境中使用Shell脚本启动和停止java程序的情况,常用的java -jar命令只能运行jar文件,有很多不方便的地方,一旦代码修改就需要重新编辑打包,其实还有很多其他的方式,这个资源中包含...

    shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止

    这个"shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止"的方案,就是一种典型的自动化运维实践,它结合了多个核心工具和技术,包括shell脚本、expect、ssh以及scp,用于实现远程服务器管理与文件...

    linux下启动Java程序和杀死java进程shell脚本

    linux下启动Java程序和杀死java进程shell脚本

    centos系统springboot启动、重启、停止shell脚本

    centos系统springboot启动、重启、停止shell脚本,centos系统springboot启动、重启、停止shell脚本

    java调用shell脚本

    首先,Java通过Runtime类或ProcessBuilder类可以执行外部程序,包括Shell脚本。`Runtime.getRuntime().exec()`方法是较早期的调用方式,而`ProcessBuilder`则是在Java 5之后引入的,提供更灵活的进程控制。 1. **...

    Shell脚本启动和停止springboot的jar包

    在本场景中,我们有两个文件——`startup.sh`和`shutdown.sh`,它们是用于启动和停止Spring Boot应用的Shell脚本,其中还涉及到内存配置。 首先,让我们深入理解`startup.sh`脚本。这个脚本的主要目标是启动一个...

    启动停止java服务的shell脚本

    创建一个启动Java服务的Shell脚本,我们通常会遵循以下步骤: 1. **定义变量**:首先,我们需要定义一些关键的环境变量,如JAVA_HOME(Java安装路径),JAR_FILE(Java应用程序的jar文件名),和WORK_DIR(工作目录...

    JAVA操作linux服务器,本文用于启动shell脚本并返回数据,简单易懂,可随时修改

    本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术点和步骤。 首先,我们需要理解Java中的SSH(Secure Shell)框架,它允许我们在安全的...

    Shell脚本定时监控tomcat,服务挂掉自动重启

    Shell脚本定时监控tomcat,服务挂掉自动重启

    shell启动java程序(jar)的脚本

    shell启动jar程序的脚本,可以根据传入的参数"start"、"stop"、"restart"启动当前目录下的jar程序。

    java调用Shell脚本.doc

    在实际开发过程中,经常会遇到需要结合Java程序与Shell脚本进行操作的情况。通过Java调用Shell脚本不仅可以实现复杂的功能,还可以提高程序的灵活性和扩展性。本文将详细介绍如何在Java中调用Shell脚本,并给出一个...

    linux系统Shell脚本运行java项目。

    linux shell脚本启动java。 ---------------------------------------- Windows编辑的sh,在linux会报错: shell unexpected end of file 解决办法: vim test.sh :set fileformat=unix :wq ----------------------...

Global site tag (gtag.js) - Google Analytics