Linux Service管理SpringBoot Jar包启停发布
通过Linux Service管理Jar包
一种不需要nohup,不需要编写shell脚本,不需要记录进程号就可以一键启停发布SpringBoot Jar包的方案。
方案实现
初始化
首先进入
/usr/lib/systemd/system
目录,可以看到该目录下有很多
.service
后缀的文件,其中就会有比较常见的
sshd.service
等系统自带服务。
然后直接
vim xxxx.service
,并粘贴以下内容即可。
其中xxxx即为你的Jar包名称或者你自定义的服务名。
ExecStart
是启动命令,直接用
java -jar xxxx.jar
即可,无需nohup,启动参数也可以随意添加。但是都需要
绝对路径
。
ExecStop
是停止命令,可以就以下内容为准,如果服务具备优雅停机,可以将
kill -9
替换成
kill -15
,而
$MAINPID
则是服务的进程号,不需要刻意查找。
ExecReload
是重启命令,本质上是先停止再启动,只需要用&&拼接即可。
[Unit]
Description=xxxx(服务名称) #当前配置文件的描述信息
After=network.target syslog.target #表示当前服务是在那个服务后面启动,一般定义为网络服务启动后启动
[Service]
Type=simple #定义启动类型
Restart=always #重启策略
ExecStart=/usr/local/jdk/bin/java -jar /opt/xxx.jar --spring.profiles.active=prod #定义启动进程时执行的命令
ExecStop=/uss/bin/kill -9 $MAINPID #定义关闭进程时执行的命令。
ExecReload=/uss/bin/kill -9 $MAINPID && /usr/local/jdk/bin/java -jar /opt/xxx.jar --spring.profiles.active=prod #重启服务时执行的命令
[Install]
WantedBy=multi-user.target #表示多用户命令行状态
vim wq
命令保存文件后,一个封包成Linux Service的Jar包服务就已经完成了。
接下来只需要再执行
systemctl daemon-reload
命令,即可令该Service生效。
服务的启停发布
# 启动服务
service xxxx.service start
# or
systemctl start xxxx.service
# 停止服务
service xxxx.service stop
# or
systemctl stop xxxx.service
# 重启服务
service xxxx.service restart
# or
systemctl restart xxxx.service
# 服务状态
service xxxx.service status
# or
systemctl status xxxx.service
# 启用开机自启
systemctl enable xxxx.service
# 禁用开机自启
systemctl disable xxxx.service
#查看服务是否开机启动
systemctl is-enabled xxxx.service
#查看已启动的服务列表
systemctl list-unit-files|grep enabled
#显示所有已启动的服务
systemctl list-units --type=service
#查看启动失败的服务列表
systemctl --failed
# 重新加载一个服务的配置文件
systemctl reload xxxx.service
至此,以上就已经实现了通过
Linux Service
管理发布SpringBoot项目Jar包服务。
优劣对比
与常规方案对比
常规情景下,很多开发者会通过一系列的方式来完成Linux环境SpringBoot项目的启停发布,譬如:
-
java -jar xxxx.jar
(java启动命令) -
nohup java -jar xxx.jar nohup.out 2>&1
(静默命令) -
jps && kill -9 #{pid}
(java进程查找消杀命令) -
ps -ef |grep #{xxxx}
(根据应用查询进程) -
lsof -i:#{port}
(根据端口号查询进程) -
netstat -nap | grep #{xxxx}
(根据端口或应用查询进程) - 等等
以上方式方案存在的问题譬如:
-
单纯的
java -jar
不能静默启动,服务生命周期与ssh会话等同。 -
nohup
命令生成的nohup.out在Slf4j日志框架下显得多余。 - 根据端口号/应用名称查询进程号步骤繁琐冗余。
-
甚至还有在启动命令中将
pid
记录在文件内。 - 市面上各类常见的shell启停脚本数不胜数,但是往往都存在很多问题,各有优劣,无法对比。
Service 管理Jar包的优势
- 无需关注进程
- 操作指令简单
- 可设定开机自启
- 服务崩溃失败自动重启
- 监控服务简单
- 等等