在 Linux 系统中将 Spring Boot 应用作为系统服务运行

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【6月更文挑战第11天】最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。

今天处理一个遗留项目的问题,有一个 Spring Boot 项目部署在一台客户内网的物理服务器上,最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。

完成这件事需要借助 systemd
它提供了一套系统启动和管理的解决方案。根据惯例,在 Linux 中,d 一般表示守护进程(daemon),比如 httpd 等。

要让一个 Spring Boot 服务随系统启动,最简单的办法就是通过 systemd 将其配置成一个系统服务。

首先,需要编写 Spring Boot 应用的启动、停止、重启三个脚本,我们的程序 JAR 包是 /path/to/xxx.jar

  • start.sh:
#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
APP_NAME=xxx
nohup java -jar /path/to/xxx.jar.jar > xxx.log 2>&1 &
echo "$APP_NAME is running"
  • stop.sh:
#!/bin/bash
APP_NAME=xxx
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`

if [ -z "${pid}" ]; then
   echo "$APP_NAME is not running"
else
    echo "kill thread...$pid"
    kill -9 $pid
fi
  • restart.sh:
#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
APP_NAME=xxx
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`

if [ -z "${pid}" ]; then
   echo "$APP_NAME is not running"
else
    echo "kill thread...$pid"
    kill -9 $pid
fi

nohup java -jar /path/to/xxx.jar > xxx.log 2>&1 &
echo "$APP_NAME is running"

以上三个脚本:

  • start.sh 是启动脚本,提供 Java 的路径,执行 JAR 文件的启动命令,输出信息。
  • stop.sh 是停止脚本,通过 ps 命令,找到程序对应进程的 PID,如果不存在,说明程序没有运行,不要任何操作,如果存在,则用 kill 命令将其杀掉。
  • restart.sh 是重启脚本,就是将以上两者结合,先终止程序,再启动。

将这三个脚本放在 /path/to/bin/ 目录中,有了以上三个脚本,现在我们配置系统服务(假设服务命名为 xxx)。

/usr/lib/systemd/system/ 目录中,创建 xxx.service 文件,其内容为:

[Unit]
Description=xxx
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/path/to/bin/start.sh
ExecReload=/path/to/bin/restart.sh
ExecStop=/path/to/bin/stop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

在这个文件中,有三个部分:

  • Unit 区块中,包含了描述内容和启动顺序的配置,After 表示在这些服务启动之后启动。
  • Service 区块主要配置启动行为,使用了之前的三个脚本文件,分别作为服务的启动、终止、重启的脚本。
  • Install 区块配置如何安装这个配置文件,WantedBy=multi-user.target 表示这个服务所在的 Target 是 multi-user.target。

有了这个配置文件,就可以使用一下命令来操作这个服务:

# 启动服务
systemctl start xxx
# 停止服务
systemctl stop xxx
# 重启服务
systemctl restart xxx
# 查看启动状态
systemctl status xxx

如果要让服务随系统启动,只需要执行如下命令:

systemctl enable xxx

如果要取消随系统启动:

systemctl disable xxx
目录
相关文章
|
5天前
|
存储 安全 Linux
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的武汉市公交路线查询系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的武汉市公交路线查询系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的旅游攻略系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的旅游攻略系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的公交系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的公交系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的个人财务系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的个人财务系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的志愿服务管理系统设计和实现(源码+LW+部署讲解)
基于SpringBoot+Vue的志愿服务管理系统设计和实现(源码+LW+部署讲解)
27 6
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的粤港澳大湾区旅游系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的粤港澳大湾区旅游系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
6天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的“期待相遇”图书借阅系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的“期待相遇”图书借阅系统的详细设计和实现(源码+lw+部署文档+讲解等)