原创

CentO S7系统使用systemctl托管Java项目


前置准备

  • 确保你的 Java 项目是 可执行 JAR 包(SpringBoot / 普通 Java 项目都可以)
  • 服务器已安装 JDK(配置好 JAVA_HOME)
  • JAR 包的绝对路径、启动端口、运行用户

创建 systemd 服务文件

systemd 服务配置文件统一放在:/etc/systemd/system目录下,本文以java-web.service为例

vim /etc/systemd/system/java-web.service

文件内容为:

[Unit]
# 服务描述
Description=Java Web Application
# 启动顺序:在网络启动后再运行,
After=network.target

[Service]
# 运行用户
User=root

# 工作目录(关键,必须保留)
WorkingDirectory=/project/java-web

# ================== 启动前预处理 ==================
# 1. 启动前删除旧日志(可选)
ExecStartPre=/usr/bin/rm -rf /project/java-web/main.log

# 2. 等待Redis完全就绪(可选)
ExecStartPre=/usr/bin/bash -c 'until echo > /dev/tcp/127.0.0.1/6379; do sleep 1; done'

# ================== 启动Java项目 ==================
# ========== /usr/bin/java 为jdk安装目录============
ExecStart=/usr/bin/java -jar -Xms256m -Xmx1024m java-web-0.0.1-SNAPSHOT.jar

# ================== 日志输出 ==================
StandardOutput=file:/project/java-web/main.log
StandardError=file:/project/java-web/main.log

# ================== 自动重启 ==================
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

关键参数说明

  • After:在依赖的服务启动后再启动,说明启动顺序
  • User: 建议用非 root 用户更安全
  • WorkingDirectory:工作目录,指定项目部署目录
  • ExecStartPre:启动前的前置检查 / 准备工作
  • ExecStart:核心启动命令,必须是绝对路径
  • Restart=always:服务挂了自动重启

注意:文件里所有命令必须写绝对路径

加载并启用服务

# 重新加载 systemd 配置
systemctl daemon-reload

常用管理命令

# 启动
systemctl start java-web

# 停止
systemctl stop java-web

# 重启
systemctl restart java-web

# 查看状态
systemctl status java-web

# 取消开机自启
systemctl disable java-web

说明

问:没有配置ExecStop,可以使用systemctl stop java-web?

答:可以用 systemctl stop java-web
systemd 有默认停止机制:执行 systemctl stop 时,systemd 会:
1.给 Java 进程发送 SIGTERM 停止信号
2.等待进程正常退出
3.如果没退出,超时后发送 SIGKILL 强制杀死
4.标记服务为已停止
 SpringBoot / Java 项目会正常关闭,不需要手动写 ExecStop。

问:配置了After,为何还要配置ExecStartPre

答:用法用处不同
ExecStartPre在执行 ExecStart之前,先执行一段命令/检查
相当于是启动前的前置检查 / 准备工作
After 是指定启动顺序,不管有没有准备就绪

配置ExecStart可以避免:依赖服务还没加载好 → Java 启动报错 → 自动重启 → 反复报错 的问题!

多个 ExecStartPre 执行规则:
	从上到下依次执行
	必须全部成功,才会执行 ExecStart
	任何一个失败 → 整个服务启动失败
	
总结:
	After= 控制启动顺序
	ExecStartPre 确保依赖服务真正就绪

问:重启规则(即Restart)还有其他选项吗

答:有,Restart有5个取值
1.Restart=no,默认值,崩溃了不重启,适用于测试、一次性脚本
2.Restart=on-success,只有正常退出才重启,极少用
3.Restart=on-failure,异常退出才重启(崩溃、被强制杀),部分服务使用
4.Restart=on-abnormal,被信号杀死 / 超时才重启,极少用
5.Restart=always,只要退出就重启,Java 项目、生产环境首选

问:java-web.service文件存放的位置只有这个吗

答:有3个目录都可以放,都能达到效果
1. /usr/lib/systemd/system
谁用:系统、rpm/yum 安装的软件
特点:系统更新会覆盖
不建议手动放

2. /etc/systemd/system
谁用:管理员(你自己)
特点:永久保存、不会被覆盖、优先级最高
适合场景:自定义服务(Docker 脚本、java服务等)

3. /usr/local/lib/systemd/system
谁用:手动编译、手动安装的软件
特点:专门给 /usr/local/ 下的软件用

优先级:(从高到低)
1./etc/systemd/system/            (最高,管理员自定义)
2./usr/local/lib/systemd/system/  (手动安装软件)
3./usr/lib/systemd/system/        (最低,系统自带)
Java
CentOS
  • 作者:一介闲人(联系作者)
  • 发表时间: 2026-03-26 18:02
  • 版权声明:原创-转载需保持署名
  • 公众号转载:请在文末添加本文链接
  • 评论