Linux环境,Service命令,一键启/停/发布SpringBoot项目Jar包服务,无需nohup,无需shell脚本,最好的实现方案

  • Post author:
  • Post category:linux




通过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包的优势

  • 无需关注进程
  • 操作指令简单
  • 可设定开机自启
  • 服务崩溃失败自动重启
  • 监控服务简单
  • 等等



版权声明:本文为NOT_TWO_CHEN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。