首页 > 系统相关 >jar通用shell启停脚本

jar通用shell启停脚本

时间:2023-04-05 18:56:38浏览次数:53  
标签:shell JAR APP jar echo 启停 033 OPTS 0m

前言

在Linux环境通过jar包启动Java进程手动输命令有点麻烦,参数多容易忘记,编写一个能启动停止的脚本会方便很多。下文提供了一个较为通用的脚本,可以灵活指定JVM启动选项和应用参数,能够应付大部分场景,有后台启动、前台启动、停止、重启、查看进程状态功能。

Shell脚本内容

脚本用java、jps相关指令实现功能,echo彩色输出到控制台。

要注意的是后台启动时丢弃掉了输出到控制台的日志(> /dev/null),也就是启动时不会输出进程启动打印的日志,因为一般项目内会有配置输出到指定的日志文件(如:Logback),可以通过这些日志文件查看服务启动和运行的状态。

# !/bin/bash

#===========================================================================================
# APP_HOME=/opt/soft/app 工作目录,存放jar包和日志等相关文件
# APP_JAR=app.jar jar包全称
# JVM_OPTS="-Xms256m -Xmx256m" JVM启动参数
# APP_OPTS="--server.port=8080 --spring.profiles.active=dev" spring配置参数、main方法接收的参数
#===========================================================================================

APP_HOME=/opt/soft/
APP_JAR=app.jar
APP_OPTS=""
JVM_OPTS="-Xms256m -Xmx256m"

function start(){
  findPid
	if [ -z "$pid" ]; then
    java -jar $JVM_OPTS $APP_HOME/$APP_JAR $APP_OPTS > /dev/null &
	  colorPrint $GREEN "$APP_JAR 已启动"
	else
	  colorPrint $YELLOW "$APP_JAR 启动失败,已存在运行的进程,进程ID为 $pid"
		exit 1
	fi
}

function startForeground(){
  findPid
	if [ -z "$pid" ]; then
	  colorPrint $GREEN "$APP_JAR 开始启动"
    java -jar $JVM_OPTS $APP_HOME/$APP_JAR $APP_OPTS
	else
	  colorPrint $YELLOW "$APP_JAR 启动失败,已存在运行的进程,进程ID为 $pid"
		exit 1
	fi
}

function stop(){
  findPid
	if [ -z "$pid" ]; then
	  colorPrint $YELLOW "$APP_JAR 停止失败,未找到运行的进程"
	else
    kill -TERM $pid
	  colorPrint $GREEN "$APP_JAR 已停止ID为 $pid 的进程"
	fi
}

function restart(){
    stop
    sleep 3
    start
}

function status() {
    info=$(jps -mlvV | grep $APP_JAR)
    if [ -z "$info" ]; then
      colorPrint $YELLOW "$APP_JAR 未找到运行的进程"
    else
      echo $info
    fi
}

# 根据APP_JAR查找进程ID
pid=
function findPid(){
    pid=$(jps | grep $APP_JAR | awk '{print $1}')
}

# 按指定的颜色打印字符串。第一个参数是颜色,第二个参数是打印的字符串
RED=31 GREEN=32 YELLOW=33
function colorPrint(){
    echo -e "\033[$1m $2 \033[0m"
}

case "$1" in
    start)
    start
    ;;
    start-foreground)
    startForeground
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    status)
    status
    ;;
    *)
    colorPrint $RED "Usage: {start | start-foreground | stop| restart | status} {后台启动|前台启动|停止|重启|查看进程状态}"
    exit 1
    ;;
esac

可以不丢掉日志(去掉 > /dev/null),直接输出到控制台,这样启动命令执行完后控制台会实时显示日志,但是窗口就被日志输出占用了,想继续执行其他操作会被频繁的日志输出打断,停止不了。关掉窗口,另起一个可以解决问题

java -jar $JVM_OPTS $APP_HOME/$APP_JAR $APP_OPTS &

如果想另外保存日志可以使用nohub启动,指定输出的日志文件路径(> nohup.log)。

2>&1的意思是将标准错误(2)重定向(>)到标准输出(&1),而标准输出重定向到了nohup.log中。

nohup java -jar $JVM_OPTS $APP_HOME/$APP_JAR $APP_OPTS > nohup.log 2>&1 &

如果需要指定日志文件可以将下面这段替换掉脚本中的start()函数:

function start(){
  findPid
	if [ -z "$pid" ]; then
    nohub java -jar $JVM_OPTS $APP_HOME/$APP_JAR $APP_OPTS >> $APP_HOME/nohub.out 2>&1 &
	  colorPrint $GREEN "$APP_JAR 已启动"
	else
	  colorPrint $YELLOW "$APP_JAR 启动失败,已存在运行的进程,进程ID为 $pid"
		exit 1
	fi
}

给脚本执行权限

# 格式为chmod +x <文件名>
chmod +x server.sh

控制台彩色输出

使用echo在控制台输出字符的时候可以指定背景和字体颜色。

  • 指定字体颜色,颜色值范围30~37
# echo -e "\033[<字体颜色值>m<要输出的字符>\033[0m"

echo -e "\033[30m黑色字\033[0m"
echo -e "\033[31m红色字\033[0m"
echo -e "\033[32m绿色字\033[0m"
echo -e "\033[33m黄色字\033[0m"
echo -e "\033[34m蓝色字\033[0m"
echo -e "\033[35m紫色字\033[0m"
echo -e "\033[36m天蓝字\033[0m"
echo -e "\033[37m白色字\033[0m"
  • 指定字体色的同时还可以指定背景色,背景颜色值的范围为40~47,字体颜色和背景颜色可以随意搭配
# echo -e "\033[<背景颜色值>;<字体颜色值>m<打印的字符串>\033[0m"

echo -e "\033[40;37m黑底白字\033[0m"
echo -e "\033[41;37m红底白字\033[0m"
echo -e "\033[42;37m绿底白字\033[0m"
echo -e "\033[43;37m黄底白字\033[0m"
echo -e "\033[44;37m蓝底白字\033[0m"
echo -e "\033[45;37m紫底白字\033[0m"
echo -e "\033[46;37m天蓝底白字\033[0m"
echo -e "\033[47;30m白底黑字\033[0m"

参考链接

kill 命令信号

菜鸟教程 - nohup

标签:shell,JAR,APP,jar,echo,启停,033,OPTS,0m
From: https://www.cnblogs.com/shuiyao3/p/17290427.html

相关文章

  • shell脚本模板
    shell脚本模板#!/bin/sh./etc/rc.d/init.d/functionsexportLANG=zh_CN.UTF-8#一级菜单menu1(){clearcat<<eof----------------------------------------|#CentOS7.9优化脚本#|----------------------------------------1.一键优化2.自定......
  • shell常用脚本
    sed使用sed来为函数统一添加宏包含sed-i's/dataTypeCast\(.*\);/FUNC_CALL\(dataTypeCast\1\);/g'file会对dataTypeCast函数添加FUNC_CALL包含。dataTypeCast(abcd);==>FUNC_CALL(dataTypeCast(abcd));......
  • VMware安装CentOS7并用FinalShell连接
    时间:2023/4/5作者:Nhenk目录1.下载2.安装3.安装虚拟机3.1CentOS7.6下载3.2CentOS7.6安装3.3CentOS7.6的安装配置3.4CentOS7.6的网络配置3.4.1自动获取IP3.5FinalShell连接CentOS7.61.下载VMware2.安装因为我之前安装了docker而开启了Hyper-V,所......
  • 在windows下通过xshell来实现跳板机配置pycharm环境和xftp文件访问
    xshell实现跳板机先使用xshell实现跳板机,并将对应的跳板机窗口打开。跳板机使用xshell的隧道功能实现,选择作为中转的服务器B的属性。选择隧道选择添加侦听端口为本机A的,后面通过localhost:7777进行访问。这个端口可以自己设置不同的。目标主机就是通过服务器B作为跳板机,要......
  • 从maven中央仓库手动下载jar包到本地仓库
    注意!!!:不能自己浏览器下载jar包拖入到本地仓库(原因:maven下载有固定格式)一、浏览器登录maven中央仓库网址【maven中央仓库网址】https://mvnrepository.com/二、搜索需要的jar包   三、点击坐标mybatis坐标进入  四、套用模板 mvndependency:get-DremoteRe......
  • istio shell
    #!/bin/sh#CopyrightIstioAuthors##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat##http://www.apache.org/li......
  • 使用PowerShell 连接Exchange及Lync/Skype服务器
    需求背景在运维Exchange/Lync/Skype时,我们经常会遇到需要创建很多自动化任务来代替我们完成重复的工作,就需要能够使用脚本连接至对应应用服务器进行自动化处理。此时我们可以使用PowerShell的方式来完成。那么我们应该如何连接到对应服务器呢?操作步骤创建PowerShell.ps1脚本:$UserC......
  • Redis未授权访问Getshell
    漏洞成因有些redis绑在0.0.0.0:6379,没有开启验证或者没有设置对未知ip来源进行限制以及默认的空密码就导致了redis默认访问但是这个普遍的漏洞极可能造成后门植入getshell,也可能造成反弹shell权限维持,甚至会造成ssh直接免密连接服务器开始复现搭建环境服务器操作系统为ubuntu......
  • Gradle下载的依赖jar包路径位置
    Gradle依赖默认下载路径Mac系统默认下载路径:C:/Users/(用户名)/.gradle/caches/modules-2/files-2.1Windows系统默认下载路径:C:\Users(用户名).gradle\caches\modules-2\files-2.1修改Gradle缓存文件夹路径1.配置环境变量添加变量GRADLE_USER_HOME,值为gradle依赖下载......
  • 版本不兼容Jar包冲突该如何是好?
    一、引言“老婆”和“妈妈”同时掉进水里,先救谁?常言道:编码五分钟,解冲突两小时。作为Java开发来说,第一眼见到ClassNotFoundException、NoSuchMethodException这些异常来说,第一反应就是排包。经过一通常规和非常规操作以后,往往会找到同一个Jar包引入了多个不同的版本,这时候一般排除掉......