Linux下启动java程序的通用脚本

简介: Linux下启动java程序的通用脚本

#!/bin/sh

#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,

#也可以作为启动java程序的独立脚本来使用。


#警告!!!:该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。


#在杀死进程前,未作任何条件检查。在某些情况下,如程序正在进行文件或数据库写操作,

#可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,

#增加在执行kill命令前的一系列检查。


###################################


#环境变量及程序执行参数

#需要根据实际环境以及Java程序名称来修改这些参数


###################################


#JDK所在路径

#JAVA_HOME=/usr/local/somnus/jdk1.7.0_80


#脚本所在的目录

APP_HOME=$(cd "$(dirname "$0")"; pwd)


#class名称,编译时替换

APP_CLASS=com.somnus.xk.core.CommonDBStart


#jar名称,编译时替换

APP_JAR_NAME=COMMON_DB-0.0.1-SNAPSHOT.jar


#CLASS_PATH=$APP_HOME/../conf

JAR_LIB=$APP_HOME/../lib

JAR_LOG=$APP_HOME/../log


#java虚拟机启动参数

JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"

JAVA_OPTS_JMX="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

#调试参数

debug_port=$2

DEBUG_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=$debug_port,server=y,suspend=n"


###################################


#(函数)判断程序是否已启动

#说明:

#使用JDK自带的JPS命令及grep命令组合,准确查找pid

#jps 加 l 参数,表示显示java的完整包路径

#使用awk,分割出pid ($1部分),及Java程序名称($2部分)


###################################


#初始化psid变量(全局)

psid=0

checkpid() {

javaps=`ps ax|grep java|grep $APP_JAR_NAME |grep -v grep`

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() {

echo "****************************"

checkpid

if [ $psid -ne 0 ]; then

echo "================================"

echo "程序: $APP_CLASS 已经启动! (进程号=$psid)"

echo "================================"

else

echo "启动 $APP_CLASS ..."

nohup java $JAVA_OPTS -jar $JAR_LIB/$APP_JAR_NAME >> nohup.out 2>&1 &

checkpid

if [ $psid -ne 0 ]; then

echo "程序: $APP_CLASS 启动成功! (进程号=$psid) [OK]"

else

echo "程序: $APP_CLASS 启动失败! [Failed]"

fi

fi

echo "****************************"

}


###################################


#(函数)停止程序

#

#说明:

#1. 首先调用checkpid函数,刷新$psid全局变量

#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行

#3. 使用kill -2 pid命令进行强制杀死进程

#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $?

#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]

#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。

#注意:echo -n 表示打印字符后,不换行

#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值


###################################


stop() {

echo "****************************"

checkpid

if [ $psid -ne 0 ]; then

echo "正在停止 $APP_CLASS ...(pid=$psid)"

kill -2 $psid

if [ $? -eq 0 ]; then

echo "停止 $APP_CLASS 成功!(pid=$psid) [OK]"

else

echo "正在停止 $APP_CLASS 失败!(pid=$psid) [Failed]"

fi


sleep 2

checkpid

if [ $psid -ne 0 ]; then

kill -9 $psid

fi

else

echo "warn: $APP_CLASS 没有运行..."

fi

echo "****************************"

}


###################################


#(函数)检查程序运行状态

#

#说明:

#1. 首先调用checkpid函数,刷新$psid全局变量

#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid

#3. 否则,提示程序未运行


###################################


status() {

echo "****************************"

checkpid

if [ $psid -ne 0 ]; then

echo "$APP_CLASS 正在运行! (进程号=$psid)"

else

echo "$APP_CLASS 没有运行"

fi

echo "****************************"

}


###################################


#(函数)打印系统环境参数


###################################


info() {

echo "System Information:"

echo "****************************"

echo `head -n 1 /somnus/issue`

echo `uname -a`

echo

echo "JAVA_HOME=$JAVA_HOME"

echo `java -version`

echo

echo "APP_HOME=$APP_HOME"

echo "APP_JAR=$APP_CLASS"

echo "****************************"

}


###################################


#(函数)打印log


###################################


log() {

tailf -500 $JAR_LOG/console.log

}


###################################


#读取脚本的第一个参数($1),进行判断

#参数取值范围:{start|debug|stop|restart|status|info|log}

#如参数不在指定范围之内,则打印帮助信息


###################################


case "$1" in

'start')

start

;;

'debug')

debug

;;

'stop')

stop

;;

'restart')

stop

start

;;

'status')

status

;;

'info')

info

;;

'log')

log

;;

'startjmx')

startjmx

;;

*)


echo "=======参数错误========="

echo "exp :$0 start {start|debug|stop|restart|status|info|log}"

exit 1

esac

exit 0

相关文章
|
20天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
2月前
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
34 1
|
3月前
|
算法 Java Linux
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
这篇文章讨论了在Linux环境下使用Java Graphics2D合成图片时遇到的中文显示问题,并提供了解决方案,包括如何在Linux系统中添加中文字体库。
52 1
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
|
2月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
98 1
|
3月前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
66 1
|
3月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
51 0
|
新零售 Java C++
java脚本引擎的设计原理浅析
本人在阿里巴巴长期担任和负责规则引擎、流程引擎相关的技术开发,另外还负责开发和维护开源项目:https://github.com/alibaba/QLExpress QLExpress是一个脚本引擎工具,类似Groovy,JRuby等,是为了解决当时电商规则动态编译、表达式高精度计算、复杂布尔运算、自定义函数和操作符号、语法树生成等需求而设计的。
16186 0
|
存储 JavaScript Java
【Java】-一文了解Java低代码实现( 脚本引擎)
【Java】-一文了解Java低代码实现( 脚本引擎)
2487 0
【Java】-一文了解Java低代码实现( 脚本引擎)