使用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