Springboot的多种部署方式和Linux具体的 service 操作介绍
前言
Springboot 内置了 tomcat,部署十分的方便,无需额外的应用服务器。但是在部署过程中,却有很多种方式
本文总结在工作中常见的 linux 部署方式
一、通过nohup命令部署
linux 可以通过 nohup 命令将项目部署在后台,即使终端退出,进程仍然在运行,并且会生成一个 nohup.out 文件
但是… 想要结束进程,只能先找到进程的 pid,再 kill 掉
nohup java -jar xxx.jar &
缺点:
1、项目升级不方便,需要先找到进程,再 kill 掉,再重新用 nohup 启动进程,步骤繁琐
2、项目升级过程中,经常需要一些额外的操作,例如备份配置文件,备份 jar。单单通过 nohup 命令,无法完成附加的额外操作
二、通过ssh脚本+nohup方式部署
前面讲了 nohup 的部署方式和它的繁琐缺点,是否能够通过 ssh 脚本自动化 nohup 的部署呢
操作步骤:先通过端口找到进程,进程存在则 kill 掉,再启动项目,无需人工操作
还可以在启动前备份好 jar 包,一些其他额外操作
#!/bin/bash
port=9090
pid=$(netstat -lnp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
if [ -n "$pid" ]; thenkill -9 $pid;
fi
nohup java -jar xxx.jar &
echo "project start completed."
缺点:
1、脚本有丢失的风险,需做好备份
2、脚本需要维护,换了端口,jar 移动了位置或改名,都需要调整脚本
3、灵活性差,如果只想停止,不想重启怎么办?或者只想执行某个步骤,这时就显得很麻烦
三、linux的service服务(推荐)
linux 的 service 功能可以很好的管理服务的启动、重启、停止,配置开机启动等信息
每次操作只需一个简单的命令,并且可以单独执行某个操作,解决了上面两种部署方案的不足
通过简单的文件配置,即可完成服务的管理,十分推荐
[Unit]
Description=example
After=syslog.target[Service]
ExecStart=java -jar /xxx.jar[Install]
WantedBy=multi-user.target
具体的 service 操作介绍:
1、service配置文件
每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。
service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节,如下
[Unit]
Description:描述,
After:在network.target,auditd.service启动后才启动
ConditionPathExists: 执行条件[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的
2、配置文件的区块
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。
Description:简短描述
Documentation:文档地址
Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition...:当前 Unit 运行必须满足的条件,否则不会运行
Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。
WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Environment:指定环境变量
3、修改配置文件后重启
修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。
重新加载配置文件
$ sudo systemctl daemon-reload
重启相关服务
$ sudo systemctl restart foobar
4、服务管理
systemctl start 服务名 开启服务
systemctl stop 服务名 关闭服务
systemctl status 服务名 显示状态
systemctl restart 服务名 重启服务
systemctl enable 服务名 开机启动服务
systemctl disable 服务名 禁止开机启动
systemctl list-units 查看系统中所有正在运行的服务
systemctl list-unit-files 查看系统中所有服务的开机启动状态
systemctl list-dependencies 服务名 查看系统中服务的依赖关系
systemctl mask 服务名 冻结服务
systemctl unmask 服务名 解冻服务
systemctl set-default multi-user.target 开机时不启动图形界面
systemctl set-default graphical.target 开机时启动图形界面修改服务配置文件后需要systemctl daemon-reload设置服务开机自启动systemctl enable postgresql.service查询是否自启动服务systemctl is-enabled postgresql.service取消服务器开机自启动systemctl disable postgresql.service
显示某个 Unit 是否正在运行
$ systemctl is-active application.service
显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
查看每个服务的启动耗时
$ systemd-analyze blame
查看当前运行的所有服务
$ systemctl list-units
查看服务是否开机启动
$ systemctl list-unit-files
这个列表显示每个配置文件的状态,一共有四种。
enabled:已建立启动链接;表示允许开机启动
disabled:没建立启动链接;表示禁止开机启动
static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
masked:该配置文件被禁止建立启动链接
显示sshd服务的状态
$ systemctl status sshd
Loaded行:配置文件的位置,是否设为开机启动
Active行:表示正在运行
Main PID行:主进程ID
Status行:由应用本身(这里是 httpd )提供的软件当前状态
CGroup块:应用的所有子进程
日志块:应用的日志
Active行:
active(running) 表示程序正在执行;
atcive(exited) 执行一次就正常退出的服务,不在系统中执行任何程序;
active(waiting) 正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行;
inactive (dead) 未启动状态;
举例:
[root@rhel7 home]# cd /etc/systemd/system/
[root@rhel7 system]# cat wxzc.service
[Unit]
Description=wxzc service
After=libvirtd.service[Service]
Type=forking
ExecStart=sh /home/test/zcservice.sh
PrivateTmp=true[Install]
WantedBy=multi-user.target
参考:
https://blog.csdn.net/liuchonghua/article/details/81743606
https://www.cnblogs.com/zwcry/p/9602756.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
相关文章:
Springboot的多种部署方式和Linux具体的 service 操作介绍
前言 Springboot 内置了 tomcat,部署十分的方便,无需额外的应用服务器。但是在部署过程中,却有很多种方式 本文总结在工作中常见的 linux 部署方式 一、通过nohup命令部署 linux 可以通过 nohup 命令将项目部署在后台,即使终端…...

【EI/SCOPUS检索】2023年第二届光学成像与测量国际会议 (ICOIM2023)
2023年第二届光学成像与量国际会议 (ICOIM2023) 2023 2nd International Conference on Optical Imaging and Measurement 光学成像与测量密切相关且具有广泛的应用,如显微镜、望远镜、传感器等。通常,成像是测量的基础…...

6 个简单步骤,教你创建可视化看板工作流
看板是一种相当流行的工作管理工具,团队和组织使用它来可视化工作流程,限制当前正在进行的工作,并最大限度地提高流程效率。 看板的一些主要特点包括: ✓ 看板提供了对工作流程进行可视化控制的手段; ✓ 看板 "…...
时间相减 示例kotlin LocalDateTime
时间相减 示例kotlin LocalDateTime fun test1(){val d1: LocalDateTime LocalDateTime.parse("2023-05-06 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))val d2: LocalDateTime LocalDateTime.parse("2023-05-07 15:12:00"…...
Boost开发指南-4.5swap
swap boost::swap是对标准库里的std::swap 的增强和泛化,为交换两个变量(可以是int等内置数据类型,或者是类实例、容器)的值提供了便捷的方法。 为了使用boost::swap,需要包含头文件<boost/swap.hpp>ÿ…...
OpenStack对接Ceph平台
OpenStack对接Ceph平台 目录 OpenStack对接Ceph平台 1、创建后端需要的存储池(ceph-01节点操作)2、创建后端用户 2.1 创建密钥(ceph-01节点操作) 2.1.1 创建用户client.cinder2.1.2 创建用户client.glance2.1.3 创建用户client.cinder-backup2.2 导出密钥(ceph-01节点操作)2.3 …...

【Vue2】动态组件的使用-切换组件和keep-alive,以及异步组件
目录 想实现切换不同列表展示不同数据方法一方法二,动态组件动态组件的父组件如何传的值动态组件的子组件如何接受传的值 认识keep-alive缓存组件的生命周期 异步组件,单独打包,实现webpack分包,如何对组件进行单独打包࿰…...

C++的IO流
目录 C语言的输入与输出 流是什么 CIO流 C标准IO流 C文件IO流 stringstream的简单介绍 在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做? 将数值类型数据格式化为字符串 字符串拼接 序列化和反序列化结构数据 注…...

nodejs+vue+elementui电影订票网站系统_wqc3k
电影订票系统在国内有很多值得借鉴的例子,功能也都趋于完善,因此此次电影订票系统将轻量化开发,要完成以下功能: (1)要支持完整的用户注册,登录功能,账号的管理通过管理员来实现。 &…...

2023-08-14 linux 串口终端输入长命令不换行,覆盖前面内容,stty命令设置串口终端行列数
一、linux 串口终端输入长命令不换行,覆盖前面内容,现象如下图: 二、解决方法:用stty 命令设置行列数 stty columns 200 stty rows 10三、参考文章 https://www.cnblogs.com/goloving/p/15170537.html 常用Linux串口设备操作命…...

根据指定日期获取周,月,季度,年的第一天和最后一天
1. 根据指定日期获取周,月,季度,年的第一天和最后一天 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 根据给定时间获取周、月度、季度、年度开始结束时间*…...

CRMEB商城系统:便捷、安全、多样化的购物方式
商城系统是当今社会商业发展的重要组成部分,它以数字化、网络化的方式提供商品和服务。商城系统通过互联网技术,将商品和消费者紧密连接,方便了购物的流程和效率。 商城系统的特点之一是无国界化。传统实体商店通常受限于地理位置和时间&…...

同步_异步请求和Ajax并利用axios框架简化
目录 同步和异步 原生的Ajax 创建XMLHttpRequest对象 常用方法 常用属性 axios框架 同步和异步 同步请求:发送请求后,会做出回应,回应的内容会覆盖浏览器中的内容,这样会打断其他正常的操作,显得不太友好&#…...

取个对象值导致系统崩溃
取个对象值导致系统崩溃 前言 想必各位小伙经常在项目中遇到一些错误,取对象值的时候,经常报错,又或者某些项目突然就挂经常都是出现在一些对象取值上面,然后就被领导一顿训斥 报错分析 例如: 下面这个报错大家想必不会陌生&am…...

nestjs 基础、使用 passport 来进行鉴权
回顾一些定义 NestJS 部分 Module 模块结构 模块是一个图状引用关系。 模块的实例化有三种模式。默认情况是 singletones 模式,也就是模块可能被引用,但不同的引用处拿的是同一个共享实例,也就是说一个进程有一个唯一的实例被共享。 模块&a…...
1.1 : DNA 螺旋
概述 脱氧核糖核酸(DNA)是负责在所有生物体和大多数病毒中代代相传性状的遗传物质。DNA由两条相互缠绕形成双螺旋的核苷酸链组成。DNA 结构的发现是在近一个世纪的时间里逐步发现的,代表了科学史上最著名、最迷人的故事之一。 DNA 结构详细信息 每条 DNA 链均由称为核苷酸…...

.gitignore匹配规则
目录 1.直接一个名称2.斜杠 /3.符号 *4.问号 ?5.感叹号 !6.gitkeep 借鉴抖音账号: 渡一前端提薪课 1.直接一个名称 会忽略目录下的所有该名称文件和文件夹,无论嵌套多深。 2.斜杠 / 1.斜杠在开头(/dist):忽略和.gitig…...

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取
Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…...
JAVA 鼠标控制与键盘输入控制
核心类:java.awt.Robot 该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: Robot rt new Robot();//可以认为是操作间隔的停歇时间,比如等待页面加载,等弹框内容展示等 r…...
VB+SQL宿舍管理系统设计与实现
摘要 统是采用Visual Basic作为前台开发工具,SQL Server作为后台数据库平台的基于C/S的两层模式的管理系统。宿舍管理系统是目前各所高校后勤管理之中的重要部分,如何能科学有效的开展好宿舍管理部分的工作,是当前高校领导人和后勤管理人员关心的问题。因此,宿舍管理部分工…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...