【Linux运维基础】Linux下优雅启动停止java -jar格式项目的脚本

简介: 本文详解Linux部署Java项目的三种方法:①简单后台启动(java -jar);②不挂断启动(nohup + &);③重定向日志的稳健部署(支持/dev/null静默或自定义日志)。同时提供进程查询、一键停止/重启及完整Shell脚本,助力高效运维。

一、Linux部署Java项目的三种方法

1、简单后台启动

直接使用java -jar命令运行jar包,当退出或者关闭远程工具就会把进程关闭

java -jar your-application.jar

这里的your-application.jar应该替换为自己想要运行的jar文件的实际文件名。

java -jar your-application.jar --spring.profiles.active=product --server.port=8080 &

说明:此语句比第一个命令多一个&符号,&表示后台运行,ssh窗口不被锁定,但是关闭窗口时,程序还是会退出。

2、不挂断后台启动

nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 &
# 再输入查询日志打印命令
tail -f nohup.out
# 这里可以指定打印日志的行数
tail -200 nohup.out

说明:nohup(no hang up)表示不挂断运行命令行,当账号退出或关闭终端时,程序仍然运行。

(1)单独使用 & , 只能实现在程序的执行期间,还能在当前会话中执行其他操作;但关闭当前会话,程序依然会自动结束。

(2)单独使用 nohup ,只能实现关闭当前会话后,程序依然能继续运行,但无法在当前会话中再执行其他操作。强行使用Ctrl+C中断的话,这时虽然可以在当前会话中执行其他操作,但是程序也结束运行了

(3)结合使用 nohup 和 & ,能同时实现:在程序的执行期间,还能在当前会话中执行其他操作;关闭当前会话后,程序依然能继续运行。

当用 nohup 命令执行时,会在当前的目录下生成nohup.out文件,该项目的所有日志都会被输出到该文件中,除非另外指定了输出文件。

3、不挂断后台启动并重定向日志

如果我们还想要指定输出文件,可以使用 > 或 >> 将输出重定向到文件中,例如:

nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 >/data/platform/log/platform-scm.txt &

那么如何让 nohup 命令不产生大量的日志文件呢?

可以利用Linux的黑洞/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

# 程序的标准输出和标准错误输出都重定向到系统的“垃圾桶”中,从而达到不输出日志的效果。
nohup java -jar your-application.jar &>/dev/null &
# 后台启动并且指定输出日志,控制台退出不会关掉应用
nohup java -jar your-application.jar >> ./your-application.log 2>&1


二、停止jar包后台运行

# 找到对应的进程然后杀掉
ps -ef | grep your-application.jar
# ps -aux | grep 程序名:通过程序名找到进程信息
# 通过进程ID结束进程
kill -9 进程号

一条命令停止脚本:

kill -9 `ps -ef | grep your-application.jar | grep -v 'grep' `

说明:两次使用管道,排除其他进程,直接杀掉相应的进程。

三、停止脚本

#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
#修改这里jar包名即可 demo-0.0.1-SNAPSHOT.jar
#JAR_NAME="xxxxxxxxxxxx.jar"
JAR_NAME="ty-listen-0.0.1-SNAPSHOT.jar"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
#SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2"
SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME}.log
echo_help()
{
    echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
if [ -z $1 ];then
    echo_help
    exit 1
fi
if [ ! -d "$LOG_DIR" ];then
    mkdir "$LOG_DIR"
fi
if [ ! -f "$LOG_PATH" ];then
    touch "$LOG_DIR"
fi
if [ "$1" == "start" ];then
# check server
    PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
        exit 1
    fi
echo "Starting the $JAR_NAME..."
    # start
    nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
    COUNT=0
    while [ $COUNT -lt 1 ]; do
        sleep 1
        COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
        if [ $COUNT -gt 0 ]; then
            break
        fi
    done
    PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
    echo "${JAR_NAME} Started and the PID is ${PIDS}."
    echo "You can check the log file in ${LOG_PATH} for details."
elif [ "$1" == "stop" ];then
    PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
    if [ -z "$PIDS" ]; then
        echo "ERROR:The $JAR_NAME does not started!"
        exit 1
    fi
echo -e "Stopping the $JAR_NAME..."
    for PID in $PIDS; do
        kill $PID > /dev/null 2>&1
    done
    COUNT=0
    while [ $COUNT -lt 1 ]; do
        sleep 1
        COUNT=1
        for PID in $PIDS ; do
            PID_EXIST=`ps --no-heading -p $PID`
            if [ -n "$PID_EXIST" ]; then
                COUNT=0
                break
            fi
        done
    done
    echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
    echo_help
    exit 1
fi

三、重启脚本

kill -9 `ps -ef | grep your-application.jar | grep -v 'grep' `
sleep 2
nohup java -jar your-application.jar --spring.profiles.active=product --server.port=8080 &
sleep 2
tail -f nohup.out
相关文章
|
23天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9416 30
|
9天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
8天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
670 1
|
22天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2495 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
5天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
431 0
|
3天前
|
存储 缓存 测试技术
QWT 3D 模块重构记:旧渲染管线改进介绍及实时瀑布图示例
QWT 3D模块完成重大重构:解耦窗口与图形(Plot+Item),摒弃OpenGL 1.x固定管线,迁至Core Profile着色器渲染;支持多图元同场景叠加,并以实时3D瀑布图验证——滑动窗口、固定色域、64帧×256点达61fps。兼容Qt 5.12+/6,LGPL协议。
163 120
|
15天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
1941 0
|
11天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
1215 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面