使用systemd来管理Spring Boot应用程序的进程

简而言之

    • シンプルな Spring Boot アプリケーションを systemd でプロセス管理する

 

    • systemd によって起動・停止・OS再起動時の自動起動などが可能になる

 

    今回の環境: Ubuntu 19.10 Eoan Ermine + Java 11 + Spting Boot 2.2.6

准备一个Spring Boot应用程序

准备一个简单的Spring Boot应用程序作为样本。

文件列表

├── build.gradle
├── settings.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── MyApp.java

请创建一个名为build.gradle的文件。

Gradle的构建配置文件。

plugins {
  id 'org.springframework.boot' version '2.2.6.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1'
sourceCompatibility = '11'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
}

gradle 设置

Gradle 构建配置文件。

rootProject.name = 'myapp'

src/main/java/com/example/MyApp.java 的路径下是我自己开发的应用程序。

返回JSON作为HTTP响应的Spring Boot应用的样例源代码。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@SpringBootApplication
@RestController
public class MyApp {

  public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
  }

  @GetMapping("/")
  public Map index() {
    return Map.of("message", "Hello, world.");
  }
}

使用Gradle进行构建,创建JAR文件。

$ gradle bootJar
$ ls build/libs/myapp-0.0.1.jar
build/libs/myapp-0.0.1.jar

准备一个用于启动的Shell脚本。

为了让设置在启动时更加灵活,此次准备了一个启动脚本。你可以将以下内容保存为名为startup.sh的任意文件名。

#!/bin/sh

# 同じディレクトリ内の JAR ファイル
java -jar `dirname $0`/myapp-0.0.1.jar --server.port=8888

由于Spring Boot可以使用不需要Shell脚本的JAR文件,因此根据需要使用这个选项也是不错的选择。

Spring Boot 应用程序的部署 – 文档

只需在文件的开头嵌入附加脚本,就可以使一个完全可执行的jar文件正常运行。

systemd 的配置

由于Spring Boot官方文档中详细介绍了具体的配置方法,因此可以作为参考。

Spring Boot应用程序的部署-文档

systemd 是 System V init 系统的继承者,目前在许多最新的 Linux 发行版中被使用。您可以继续在 systemd 中使用 init.d 脚本,也可以使用 systemd 的 “服务” 脚本来启动 Spring Boot 应用程序。

放置配置设置文件

创建一个名为myapp.service的服务单元配置文件。

[Unit]
Description=This is my application.
After=syslog.target

[Service]
User=foo
ExecStart=/home/foo/myapp/startup.sh
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

将配置文件放置在 /etc/systemd/system。
这次将文件本身放在主目录下,并创建了一个符号链接。

$ sudo ln -s /home/foo/myapp/myapp.service /etc/systemd/system/myapp.service

请使用 “systemctl list-unit-files” 命令确认配置是否已经设置。

$ systemctl list-unit-files --type=service | grep myapp
myapp.service                          linked

启用服务

通过使用”systemctl enable”命令,可以启用服务。
这样一来,我们就可以通过”systemctl”命令来启动、停止服务,以及实现在操作系统重新启动时自动启动服务等功能。

$ sudo systemctl enable myapp
Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /home/foo/myapp/myapp.service.

确认启动

使用systemctl start命令启动服务。

$ sudo systemctl start myapp

使用systemctl status命令可以查看服务的状态,并显示日志。

$ sudo systemctl status myapp
● myapp.service - My Application
   Loaded: loaded (/home/foo/myapp/myapp.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-24 05:19:49 JST; 2s ago
 Main PID: 3822 (startup.sh)
    Tasks: 20 (limit: 2320)
   Memory: 150.3M
   CGroup: /system.slice/myapp.service
           ├─3822 /bin/sh /home/foo/myapp/startup.sh
           └─3825 java -jar /home/foo/myapp/myapp-0.0.1.jar --server.port=8888

 4月 24 05:19:49 my-foo-host systemd[1]: Started My Application.
 4月 24 05:19:50 my-foo-host startup.sh[3822]:   .   ____          _            __ _ _
 4月 24 05:19:50 my-foo-host startup.sh[3822]:  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
 4月 24 05:19:50 my-foo-host startup.sh[3822]: ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 4月 24 05:19:50 my-foo-host startup.sh[3822]:  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
 4月 24 05:19:50 my-foo-host startup.sh[3822]:   '  |____| .__|_| |_|_| |_\__, | / / / /
 4月 24 05:19:50 my-foo-host startup.sh[3822]:  =========|_|==============|___/=/_/_/_/
 4月 24 05:19:50 my-foo-host startup.sh[3822]:  :: Spring Boot ::        (v2.2.6.RELEASE)

确认Spring Boot应用程序正在运行。

$ curl http://localhost:8888/
{"message":"Hello, world."}

请提供参考资料。
请给出参考资料。
请准备一些参考资料。
请指定一些参考资料。
请附上参考资料。

    • Spring Boot アプリケーションのデプロイ – ドキュメント

 

    • Ubuntu – eoan の systemd パッケージに関する詳細

 

    • systemctl

 

    systemd.service
广告
将在 10 秒后关闭
bannerAds