Centos系统里运行java的jar包
目前使用springboot开发是嵌入方式的tomcat,不需要单独使用tomcat,那么经常在服务器上运行jar包,这里记录一下在centos7系统里运行jar的方式。
在运行之前需要确定centos7系统是否安装了java环境以及配置环境变量,还有jar需要运行的 jdk版本,比如java jdk1.8
demo地址:Centos系统里运行java的jar启动脚本
在ssh窗口直接运行jar包
java -jar boot-example-hello-0.0.1-SNAPSHOT.jar
这种直接运行的方式优点是快速运行,临时测试的时候可以用,但是在关闭ssh连接窗口或者ctrl+c后就会停掉或打断改方式,长时间运行是不行的。
2.在ssh窗口使用nohup方式运行jar包
nohup java -jar boot-example-hello-0.0.1-SNAPSHOT.jar &
nohup 指的是不挂断运行命令,当ssh窗口退出后,程序是可以运行的,但是这样会产生nohup.out文件,这个文件会越来越大,当然也可以指定文件,或者不要nohup等日志文件,直接扔进垃圾箱里
有控制台日志的方式
nohup java -jar boot-example-hello-0.0.1-SNAPSHOT.jar > run.log &
无日志的方式
nohup java -jar boot-example-hello-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
3.使用.sh脚本方式启动jar包
新建脚本文件boot-example-hello.sh(注意centos和windows的.sh文件末尾的换行符可能导致.sh文件启动失败)
#!/bin/sh
RESOURCE_NAME=boot-example-hello-0.0.1-SNAPSHOT.jar# 先kill -15 pid
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
# 再kill -9 pid
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
# 启动app
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; thenecho 'App is running.'
elseecho 'App is NOT running.'
firm -f tpid
nohup java -jar $RESOURCE_NAME > /dev/null 2>&1 &
# nohup java -jar $RESOURCE_NAME > boot-example-hello.log &
echo $! > tpid
echo Start Success!
将脚本文件和jar包放在同一个目录下面

关键点儿
RESOURCE_NAME=boot-example-hello-0.0.1-SNAPSHOT.jar
脚本文件需要给执行权限
chmod u+x boot-example-hello.sh
[root@myw ~]# cd /home/boot-java
[root@myw boot-java]# ls
boot-example-hello-0.0.1-SNAPSHOT.jar boot-example-hello.sh
[root@myw boot-java]# chmod u+x boot-example-hello.sh
[root@myw boot-java]# ./boot-example-hello.sh
Stop Success!
App is NOT running.
Start Success!
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 11503/java
[root@myw boot-java]# ./boot-example-hello.sh
Stop Process...
Stop Success!
App is NOT running.
Start Success!
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 11616/java
[root@myw boot-java]# kill -9 11616
[root@myw boot-java]# netstat -lnp|grep java
[root@myw boot-java]#
可以看到如此方便多了,不管jar包是否之前启动过,只要执行这个脚本都是可以启动的,如果之前启动过,那么会被杀掉重新启动,要把他杀掉的话,直接kill -9 pid方式(非常暴力,但也非常使用,很重要的项目不能这么玩,万一程序有未完成的任务就麻烦了)
可是这么玩,万一云服务器掉电或者其他原因重启,那么也需要重新运行脚本
4.在.sh脚本里增加输入参数,使之能够start stop restart和建立服务启动方式,支持开机启动
新建脚本文件boot-example-hello-service.sh
我部署的java jdk路径在/usr/local/jdk18/bin下面
jar包路径在/home/boot-java
具体jar包boot-example-hello-0.0.1-SNAPSHOT.jar
因为开机启动需要,所以java的启动路径写全了的
#!/bin/bash
# java sdk 环境路径
JAVA_HOME_BIN="/usr/local/jdk18/bin"
# jar包路径
RESOURCE_PATH="/home/boot-java"
# jar包名字
RESOURCE_NAME="boot-example-hello-0.0.1-SNAPSHOT.jar"
# param start stop restart
param=$1
pid=`ps -ef|grep java|grep $RESOURCE_NAME|awk '{print $2}'`startup(){nohup $JAVA_HOME_BIN/java $RESOURCE_PARAM -jar $RESOURCE_PATH/$RESOURCE_NAME > /dev/null 2>&1 &#nohup $JAVA_HOME_BIN/java -jar $RESOURCE_PATH/$RESOURCE_NAME > $RESOURCE_PATH/run.log &sleep 3echo "$RESOURCE_NAME to running pid="`ps -ef|grep java|grep $RESOURCE_NAME|awk '{print $2}'`
}if [ ! $param ]; thenecho "specify param 'start|restart|stop'"exit
fiif [ $param == 'start' ]; thenif [ ! $pid ]; thenstartupelseecho "$RESOURCE_NAME is running pid=$pid"fi
fiif [ $param == 'restart' ]; thenif [ $pid ]; thenkill -9 $pidsleep 1echo "$pid is killed"fisleep 3startup
fiif [ $param == 'stop' ]; thenif [ $pid ]; thenkill -9 $pidsleep 3fiecho "$RESOURCE_NAME is stopped"
fi
运行指令
启动:./boot-example-hello-service.sh start
停止:./boot-example-hello-service.sh stop
重启:./boot-example-hello-service.sh restart
也是放在jar包的相同目录

先给脚本权限
chmod u+x boot-example-hello-service.sh
[root@myw boot-java]# chmod u+x boot-example-hello-service.sh
[root@myw boot-java]# ./boot-example-hello-service.sh start
boot-example-hello-0.0.1-SNAPSHOT.jar to running pid=11850
[root@myw boot-java]# ./boot-example-hello-service.sh start
boot-example-hello-0.0.1-SNAPSHOT.jar is running pid=11850
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 11850/java
[root@myw boot-java]# ./boot-example-hello-service.sh restart
11850 is killed
boot-example-hello-0.0.1-SNAPSHOT.jar to running pid=11921
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 11921/java
[root@myw boot-java]# ./boot-example-hello-service.sh stop
boot-example-hello-0.0.1-SNAPSHOT.jar is stopped
[root@myw boot-java]# netstat -lnp|grep java
[root@myw boot-java]#
新建一个服务boot-hello.service
[Unit]
Description=java boot
After=network.target
After=network-online.target[Service]
Type=forking
ExecStart=/home/boot-java/boot-example-hello-service.sh start
ExecReload=/home/boot-java/boot-example-hello-service.sh restart
ExecStop=/home/boot-java/boot-example-hello-service.sh stop[Install]
WantedBy=multi-user.target
放入/etc/systemd/system/里面后刷新加载
/usr/lib/systemd/system/
[root@myw boot-java]# systemctl daemon-reload
[root@myw boot-java]# systemctl start boot-hello.service
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 12216/java
[root@myw boot-java]# systemctl restart boot-hello.service
[root@myw boot-java]# netstat -lnp|grep java
tcp6 0 0 :::8116 :::* LISTEN 12284/java
[root@myw boot-java]# systemctl stop boot-hello.service
[root@myw boot-java]# netstat -lnp|grep java
[root@myw boot-java]# systemctl enable boot-hello.service
Created symlink from /etc/systemd/system/multi-user.target.wants/boot-hello.service to /usr/lib/systemd/system/boot-hello.service.
[root@myw boot-java]#
开机启动配置后使用reboot重启就可以测试
记录一下相关指令
// 重新加载
systemctl daemon-reload// 启动
systemctl start boot-hello.service// 重启
systemctl restart boot-hello.service// 停止
systemctl stop boot-hello.service// 加入开机启动
systemctl enable boot-hello.service// 取消开机启动
systemctl disable boot-hello.service// 查看所有的开机启动项
systemctl list-unit-files|grep enabled
有的时候我们要调优,就是设置jar包启动的堆栈参数
-Xms 是jvm启动时分配的内存,比如-Xms256m,表示分配256M
-Xmx 是jvm运行过程中分配的最大内存,比如-Xms512m,表示jvm进程最多只能够占用512M内存
-Xss 是jvm启动的每个线程分配的内存大小,比如-Xss=10m 表示分配了10M
那么启动jar包的运行指令
nohup java -Xms256m -Xmx512m -Xss10m -jar boot-example-hello-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
一般使用默认参数,有必要优化的可以在在启动脚本里设置
#!/bin/bash
# java sdk 环境路径
JAVA_HOME_BIN="/usr/local/jdk18/bin"# jar调优参数 这里开头和结尾没有空格 运行指令里有空格的
RESOURCE_PARAM="-Xms256m -Xmx512m -Xss10m"
# jar包路径
RESOURCE_PATH="/home/boot-java"
# jar包名字
RESOURCE_NAME="boot-example-hello-0.0.1-SNAPSHOT.jar"
# param start stop restart
param=$1
pid=`ps -ef|grep java|grep $RESOURCE_NAME|awk '{print $2}'`startup(){nohup $JAVA_HOME_BIN/java $RESOURCE_PARAM -jar $RESOURCE_PATH/$RESOURCE_NAME > /dev/null 2>&1 &sleep 3echo "$RESOURCE_NAME to running pid="`ps -ef|grep java|grep $RESOURCE_NAME|awk '{print $2}'`
}if [ ! $param ]; thenecho "specify param 'start|restart|stop'"exit
fiif [ $param == 'start' ]; thenif [ ! $pid ]; thenstartupelseecho "$RESOURCE_NAME is running pid=$pid"fi
fiif [ $param == 'restart' ]; thenif [ $pid ]; thenkill -9 $pidsleep 1echo "$pid is killed"fisleep 3startup
fiif [ $param == 'stop' ]; thenif [ $pid ]; thenkill -9 $pidsleep 3fiecho "$RESOURCE_NAME is stopped"
fi
相关文章:

Centos系统里运行java的jar包
目前使用springboot开发是嵌入方式的tomcat,不需要单独使用tomcat,那么经常在服务器上运行jar包,这里记录一下在centos7系统里运行jar的方式。在运行之前需要确定centos7系统是否安装了java环境以及配置环境变量,还有jar需要运行的…...

招标采购流程的电子招标采购,是管理复杂供应链和多层供应商的高效方式。
负载均衡(Load Balance) 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设…...
【C语言】C程序结构和基本语法
1、C语言程序结构 我们学习一门编程语言,第一个实例都是"hello world!",下面看一个最简单的C程序结构。 #include <stdio.h>int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }程序的第一行 #incl…...

YOLOv8 目标检测 | 自定义数据集
本文介绍了使用用于目标检测的自定义数据训练 YOLOv8 模型。我正在使用来自 kaggle 的 yolo 格式的“Face Mask Dataset”,数据集链接如下:https://www.kaggle.com/datasets/maalialharbi/face-mask-dataset?resourcedownloadYOLOv8 是目前最先进的 YOL…...

Lua语法入门
注意:文章将持续更新完善 文章目录一. 初识Lua二. HelloWorld三. Lua的数据类型四. 变量五. 循环六. 函数七. 条件控制一. 初识Lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中&#…...
华为OD机试真题JAVA实现【最小步骤数】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出解题思路...
预检请求OPTIONS
这里写目录标题简单请求和非简单请求简单请求非简单请求预检请求OPTIONS简单请求和非简单请求 浏览器将请求分为两大类:简单请求(simple request)和非简单请求(not-so-simple request) 简单请求 简单请求࿰…...

引入短信服务发送手机验证码进行安全校验
其他方案>引入QQ邮箱发送验证码进行安全校验 相对短信验证码,操作更简单而且免费 最近想给自己的项目在注册时加点安全校验,准备使用免费的邮箱验证来着,在上一篇引入QQ邮箱进行安全校验时,看有朋友说阿里云会送一些短信服务免…...

opencv绘制直线
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...

Seata源码学习(五)- Seata服务端(TC)源码解读
Seata源码分析- Seata服务端(TC)源码解读 上节课我们已经分析到了SQL语句最终的执行器,但是再往下分析之前,我们需要先来分析一下TM客户端与TC端通讯以后,TC端的具体操作 服务端表解释 我们的Seata服务端在应用的时…...

低版本jQuery导致XSS Nuclei FUZZ POC
目录 1.前言 2. Nuclei FUZZ jQuery XSS POC 3.漏洞验证 4.修复建议 1.前言 我记得以前用那些漏扫工具时时常会报一个低版本jQuery的安全问题,当时还不会验证。直到有一天,它托梦给我。我悟了。低版本jQuery导致XSS POC文件文末获取。...

【Linux】进程的描述组织与进程状态
文章目录🎪 进程的描述组织🚀1.什么是进程🚀2.进程的形成🚀3.进程标识符 *⭐3.1 PS命令查看PID⭐3.2 /proc目录查看进程属性🚀4.父子进程⭐4.1 系统调用获取PID⭐4.2 fork创建子进程⭐4.3 fork双返回值问题⭐4.4 写时拷…...
8.2.1.1 WHERE 子句优化
本节讨论可用于处理 WHERE 子句的优化。示例使用 SELECT 语句,但相同的优化适用于 DELETE 和 UPDATE 语句中的 WHERE 子句。 注意 因为 MySQL 优化器的工作正在进行,所以这里并没有记录 MySQL 执行的所有优化。 您可能会尝试重写查询以使算术运算更快&am…...

拆个微波炉,分析一下电路
微波炉是用2450MHz的超高频电磁波来加热食品,它能无损穿越塑料,陶瓷,不能穿越金属,碰到金属会反射,但穿过含水食物,食物内的分子会高速摩擦,产生热量,使食物变熟。在厨房电器中&…...

DM8:DMDSC共享存储集群搭建-共享存储绑定
DM8:DMDSC共享存储集群搭建-共享存储绑定环境介绍:1 发现共享磁盘2 对共享存储进行分区格式化2.1 格式化成功但不可用2.2 解决问题修改错误的分区格式3 配置/etc/rc.d/rc.local3.1 编辑文件(两个节点配置相同)3.2 使rc.local生效4 重启操作系…...
Spark OOM问题常见解决方式
文章目录Spark OOM问题常见解决方式1.map过程产生大量对象导致内存溢出2.数据不平衡导致内存溢出3.coalesce调用导致内存溢出4.shuffle后内存溢出5. standalone模式下资源分配不均匀导致内存溢出6.在RDD中,共用对象能够减少OOM的情况优化1.使用mapPartitions代替大部…...

【Calcite源码学习】ImmutableBitSet介绍
Calcite中实现了一个ImmutableBitSet类,用于保存bit集合。在很多优化规则和物化视图相关的类中都使用了ImmutableBitSet来保存group by字段或者聚合函数参数字段对应的index,例如: //MaterializedViewAggregateRule#compensateViewPartial()…...

RabbitMQ相关概念介绍
这篇文章主要介绍RabbitMQ中几个重要的概念,对于初学者来说,概念性的东西可能比较难以理解,但是对于理解和使用RabbitMQ却必不可少,初学阶段,现在脑海里留有印象,随着后续更加深入的学习,就会很…...
在jenkins容器内部使用docker
在jenkins容器内部使用docker 1.使用本地的docker 进入/var/run,找到docker.sock [rootnpy run]# ls auditd.pid containerd cryptsetup dmeventd-client docker.pid initramfs lvm netreport sepermit sudo tmpfiles.d user chro…...

分布式事务解决方案
数据不会无缘无故丢失,也不会莫名其妙增加 一、概述 1、曾几何时,知了在一家小公司做项目的时候,都是一个服务打天下,所以涉及到数据一致性的问题,都是直接用本地事务处理。 2、随着时间的推移,用户量增…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...

云原生时代的系统设计:架构转型的战略支点
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...