Springboot的多种部署方式和Linux具体的 service 操作介绍

前言

Springboot 内置了 tomcat,部署十分的方便,无需额外的应用服务器。但是在部署过程中,却有很多种方式

本文总结在工作中常见的 linux 部署方式

一、通过nohup命令部署

linux 可以通过 nohup 命令将项目部署在后台,即使终端退出,进程仍然在运行,并且会生成一个 nohup.out 文件

但是... 想要结束进程,只能先找到进程的 pid,再 kill 掉

bash 复制代码
nohup java -jar xxx.jar  &

缺点:

1、项目升级不方便,需要先找到进程,再 kill 掉,再重新用 nohup 启动进程,步骤繁琐

2、项目升级过程中,经常需要一些额外的操作,例如备份配置文件,备份 jar。单单通过 nohup 命令,无法完成附加的额外操作

二、通过ssh脚本+nohup方式部署

前面讲了 nohup 的部署方式和它的繁琐缺点,是否能够通过 ssh 脚本自动化 nohup 的部署呢

操作步骤:先通过端口找到进程,进程存在则 kill 掉,再启动项目,无需人工操作

还可以在启动前备份好 jar 包,一些其他额外操作

bash 复制代码
#!/bin/bash
port=9090
pid=$(netstat -lnp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
if [ -n "$pid" ]; then
    kill -9 $pid;
fi
nohup java -jar xxx.jar & 
echo "project start completed."

缺点:

1、脚本有丢失的风险,需做好备份

2、脚本需要维护,换了端口,jar 移动了位置或改名,都需要调整脚本

3、灵活性差,如果只想停止,不想重启怎么办?或者只想执行某个步骤,这时就显得很麻烦

三、linux的service服务(推荐)

linux 的 service 功能可以很好的管理服务的启动、重启、停止,配置开机启动等信息

每次操作只需一个简单的命令,并且可以单独执行某个操作,解决了上面两种部署方案的不足

通过简单的文件配置,即可完成服务的管理,十分推荐

bash 复制代码
[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]三个小节,如下

bash 复制代码
[Unit]
Description:描述,
After:在network.target,auditd.service启动后才启动
ConditionPathExists: 执行条件

[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启

[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的

2、配置文件的区块

Unit\]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。 ```bash 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 才有这个区块。它的主要字段如下。 ```bash 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、修改配置文件后重启 修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。 # 重新加载配置文件 ```bash $ sudo systemctl daemon-reload ``` # 重启相关服务 ```bash $ sudo systemctl restart foobar ``` 4、服务管理 ```bash 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 是否正在运行 ```bash $ systemctl is-active application.service ``` # 显示某个 Unit 是否处于启动失败状态 ```bash $ systemctl is-failed application.service ``` # 显示某个 Unit 服务是否建立了启动链接 ```bash $ systemctl is-enabled application.service ``` # 查看每个服务的启动耗时 ```bash $ systemd-analyze blame ``` # 查看当前运行的所有服务 ```bash $ systemctl list-units ``` # 查看服务是否开机启动 ```bash $ systemctl list-unit-files ``` 这个列表显示每个配置文件的状态,一共有四种。 enabled:已建立启动链接;表示允许开机启动 disabled:没建立启动链接;表示禁止开机启动 static:该配置文件没有\[Install\]部分(无法执行),只能作为其他配置文件的依赖 masked:该配置文件被禁止建立启动链接 # 显示sshd服务的状态 ```bash $ systemctl status sshd ``` Loaded行:配置文件的位置,是否设为开机启动 Active行:表示正在运行 Main PID行:主进程ID Status行:由应用本身(这里是 httpd )提供的软件当前状态 CGroup块:应用的所有子进程 日志块:应用的日志 Active行: active(running) 表示程序正在执行;   atcive(exited) 执行一次就正常退出的服务,不在系统中执行任何程序;   active(waiting) 正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行;   inactive (dead) 未启动状态; 举例: ```bash [root@rhel7 home]# cd /etc/systemd/system/ [root@rhel7 system]# cat wxzc.service ``` ```bash [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

相关推荐
柚几哥哥1 分钟前
IntelliJ IDEA全栈Git指南:从零构建到高效协作开发
java·git·intellij-idea
技术liul6 分钟前
解决Spring Boot Configuration Annotation Processor not configured
java·spring boot·后端
博观而约取10 分钟前
Linux 和 macOS 终端中常见的快捷键操作
linux·运维·macos
chushiyunen17 分钟前
dom操作笔记、xml和document等
xml·java·笔记
whisperrr.17 分钟前
【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
xml·java·spring
chushiyunen20 分钟前
tomcat使用笔记、启动失败但是未打印日志
java·笔记·tomcat
天上掉下来个程小白26 分钟前
HttpClient-03.入门案例-发送POST方式请求
java·spring·httpclient·苍穹外卖
ModestCoder_36 分钟前
将一个新的机器人模型导入最新版isaacLab进行训练(以unitree H1_2为例)
android·java·机器人
林政硕(Cohen0415)40 分钟前
Linux驱动开发进阶(三)- 热插拔机制
linux·驱动开发·热插拔
wangjun515942 分钟前
linux,物理机、虚拟机,同时内外网实现方案;物理机与虚拟机互通网络;
linux·服务器·网络