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

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

今天处理一个遗留项目的问题,有一个 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
复制代码

おすすめ

転載: juejin.im/post/7067830408884256798