当前位置: 首页 > news >正文

Centos系统里运行java的jar包

目前使用springboot开发是嵌入方式的tomcat,不需要单独使用tomcat,那么经常在服务器上运行jar包,这里记录一下在centos7系统里运行jar的方式。

在运行之前需要确定centos7系统是否安装了java环境以及配置环境变量,还有jar需要运行的 jdk版本,比如java jdk1.8

demo地址:Centos系统里运行java的jar启动脚本

  1. 在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语言程序结构 我们学习一门编程语言&#xff0c;第一个实例都是"hello world!"&#xff0c;下面看一个最简单的C程序结构。 #include <stdio.h>int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }程序的第一行 #incl…...

YOLOv8 目标检测 | 自定义数据集

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

Lua语法入门

注意&#xff1a;文章将持续更新完善 文章目录一. 初识Lua二. HelloWorld三. Lua的数据类型四. 变量五. 循环六. 函数七. 条件控制一. 初识Lua Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#…...

华为OD机试真题JAVA实现【最小步骤数】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出解题思路...

预检请求OPTIONS

这里写目录标题简单请求和非简单请求简单请求非简单请求预检请求OPTIONS简单请求和非简单请求 浏览器将请求分为两大类&#xff1a;简单请求&#xff08;simple request&#xff09;和非简单请求&#xff08;not-so-simple request&#xff09; 简单请求 简单请求&#xff0…...

引入短信服务发送手机验证码进行安全校验

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

opencv绘制直线

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

Seata源码学习(五)- Seata服务端(TC)源码解读

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

低版本jQuery导致XSS Nuclei FUZZ POC

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

【Linux】进程的描述组织与进程状态

文章目录&#x1f3aa; 进程的描述组织&#x1f680;1.什么是进程&#x1f680;2.进程的形成&#x1f680;3.进程标识符 *⭐3.1 PS命令查看PID⭐3.2 /proc目录查看进程属性&#x1f680;4.父子进程⭐4.1 系统调用获取PID⭐4.2 fork创建子进程⭐4.3 fork双返回值问题⭐4.4 写时拷…...

8.2.1.1 WHERE 子句优化

本节讨论可用于处理 WHERE 子句的优化。示例使用 SELECT 语句&#xff0c;但相同的优化适用于 DELETE 和 UPDATE 语句中的 WHERE 子句。 注意 因为 MySQL 优化器的工作正在进行&#xff0c;所以这里并没有记录 MySQL 执行的所有优化。 您可能会尝试重写查询以使算术运算更快&am…...

拆个微波炉,分析一下电路

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

DM8:DMDSC共享存储集群搭建-共享存储绑定

DM8:DMDSC共享存储集群搭建-共享存储绑定环境介绍&#xff1a;1 发现共享磁盘2 对共享存储进行分区格式化2.1 格式化成功但不可用2.2 解决问题修改错误的分区格式3 配置/etc/rc.d/rc.local3.1 编辑文件&#xff08;两个节点配置相同&#xff09;3.2 使rc.local生效4 重启操作系…...

Spark OOM问题常见解决方式

文章目录Spark OOM问题常见解决方式1.map过程产生大量对象导致内存溢出2.数据不平衡导致内存溢出3.coalesce调用导致内存溢出4.shuffle后内存溢出5. standalone模式下资源分配不均匀导致内存溢出6.在RDD中&#xff0c;共用对象能够减少OOM的情况优化1.使用mapPartitions代替大部…...

【Calcite源码学习】ImmutableBitSet介绍

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

RabbitMQ相关概念介绍

这篇文章主要介绍RabbitMQ中几个重要的概念&#xff0c;对于初学者来说&#xff0c;概念性的东西可能比较难以理解&#xff0c;但是对于理解和使用RabbitMQ却必不可少&#xff0c;初学阶段&#xff0c;现在脑海里留有印象&#xff0c;随着后续更加深入的学习&#xff0c;就会很…...

在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…...

分布式事务解决方案

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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...