jar通用shell启停脚本

前言

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 "33[$1m $2 33[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在控制台输出字符的时候可以指定背景和字体颜色。

jar通用shell启停脚本

  • • 指定字体颜色,颜色值范围30~37

echo -e "33[<字体颜色值>m<要输出的字符>33[0m"

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

echo -e "33[<背景颜色值>;<字体颜色值>m<打印的字符串>33[0m"

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

参考链接

kill 命令信号[1]

菜鸟教程 – nohup[2]

引用链接

[1] kill 命令信号: https://www.runoob.com/linux/linux-comm-kill.html
[2] 菜鸟教程 – nohup: https://www.runoob.com/linux/linux-comm-nohup.html


原文始发于微信公众号(我有八千部下):jar通用shell启停脚本

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/102423.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!