Linux 下将 Java Jar 包配置为开机自启(使用 systemd)

Linux 下将 Java Jar 包配置为开机自启(使用 systemd)

一、背景

我们经常使用 nohup java -jar ... & 的方式在后台启动 Spring Boot 等 Jar 包应用。

但这种方式在服务器重启后不会自动启动,需要手动再次执行命令。

本教程将以一个实际命令为例,演示如何将其配置为 系统服务 ,实现 开机自启、异常重启、日志管理

示例原始命令:

bash 复制代码
nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar VSL-1.0-SNAPSHOT.jar > app.log 2>&1 &
  • 用户:fr1511b
  • 工作目录:/home/fr1511b/ishz
  • 日志文件:/home/fr1511b/ishz/app.log

二、环境准备

  • 操作系统:CentOS 7+ / Ubuntu 16.04+ / Debian 8+ (支持 systemd)
  • Java 环境已安装,可通过 which java 查看 Java 路径
  • 已有一个可运行的 Jar 包

确认 Java 路径:

bash 复制代码
which java
# 输出示例:/usr/bin/java

三、方法一:使用 systemd 服务(强烈推荐)

1. 创建服务单元文件

使用 root 权限在 /etc/systemd/system/ 下创建服务文件,名称可自定义,例如 vsl.service

bash 复制代码
sudo vim /etc/systemd/system/vsl.service

填入以下内容(根据实际情况修改路径和用户):

ini 复制代码
[Unit]
Description=VSL Java Application
After=network.target

[Service]
Type=simple
User=fr1511b
WorkingDirectory=/home/fr1511b/ishz
ExecStart=/usr/bin/java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar /home/fr1511b/ishz/VSL-1.0-SNAPSHOT.jar
Restart=on-failure
RestartSec=10
StandardOutput=append:/home/fr1511b/ishz/app.log
StandardError=append:/home/fr1511b/ishz/app.log

[Install]
WantedBy=multi-user.target
参数详解:
  • User:指定运行服务的用户,避免使用 root 提升安全性。
  • WorkingDirectory:设置工作目录,便于应用读取相对路径的文件。
  • ExecStart:就是原本的 Java 启动命令,不需要nohup&,systemd 会自动后台运行。
  • Restart=on-failure:进程异常退出时自动重启。
  • RestartSec=10:重启间隔 10 秒,防止频繁失败占用资源。
  • StandardOutputStandardError:将标准输出和错误都追加到指定的日志文件中(替代原来的 > app.log 2>&1)。
    如果不需要文件日志,可省略这两行,用 journalctl 查看日志。

提示 :如果 Java 不在 /usr/bin/java,请用 which java 的结果替换,或者通过 Environment=JAVA_HOME=... 指定环境变量。

2. 重载 systemd 配置

bash 复制代码
sudo systemctl daemon-reload

3. 设置开机自启

bash 复制代码
sudo systemctl enable vsl.service

4. 启动服务(立即运行,无需重启系统)

bash 复制代码
sudo systemctl start vsl.service

5. 检查服务状态

bash 复制代码
sudo systemctl status vsl.service

看到 active (running) 即表示启动成功。


四、服务日常管理命令

操作 命令
启动服务 sudo systemctl start vsl
停止服务 sudo systemctl stop vsl
重启服务 sudo systemctl restart vsl
查看状态 sudo systemctl status vsl
查看实时日志(journal) sudo journalctl -u vsl -f
查看文件日志 tail -f /home/fr1511b/ishz/app.log
禁止开机自启 sudo systemctl disable vsl

五、方法二:使用 /etc/rc.local(备选,不推荐)

如果系统不支持 systemd,或临时需要快速实现,可编辑 /etc/rc.local 文件。

bash 复制代码
sudo vim /etc/rc.local

exit 0 之前添加:

bash 复制代码
su - fr1511b -c 'cd /home/fr1511b/ishz && nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar VSL-1.0-SNAPSHOT.jar > app.log 2>&1 &'

确保该文件具有可执行权限:

bash 复制代码
sudo chmod +x /etc/rc.local

缺点

  • 无法方便地 start/stop/status 管理
  • 异常退出不会自动重启
  • 日志管理不灵活

六、常见问题

Q1:服务启动后马上就停止了?

检查 status 输出的错误日志。常见原因:

  • Java 命令路径不对,用 which java 确认。
  • Jar 包路径错误或文件不存在。
  • 配置文件 application.yml 有错误导致应用启动失败。

Q2:如何更新 Jar 包并重启服务?

bash 复制代码
# 替换新的 Jar 包
cp /path/to/new/VSL-1.0-SNAPSHOT.jar /home/fr1511b/ishz/
# 重启服务
sudo systemctl restart vsl

Q3:想要使用自己安装的特定 JDK 版本?

[Service] 中添加环境变量,例如:

ini 复制代码
Environment=JAVA_HOME=/usr/local/jdk-17
ExecStart=${JAVA_HOME}/bin/java -jar ...

Q4:应用需要读取环境变量怎么办?

使用 EnvironmentEnvironmentFile 指定,例如:

ini 复制代码
EnvironmentFile=/home/fr1511b/ishz/env.conf

然后在 env.conf 中写入 KEY=value 形式的变量。


七、总结

通过 systemd 管理 Jar 包应用是生产环境的标准做法,不仅实现了开机自启,还提供了进程守护、日志统一管理、方便启停等优势。

只需简单的几步即可替代传统的 nohup 手动启动方式,推荐大家使用。

相关推荐
嘻哈∠※5 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
ltl6 小时前
实时 OS 巡礼:VxWorks、QNX、Zephyr 与 PREEMPT_RT
linux
我是谁??6 小时前
Ubuntu22.04更换清华源
linux·运维·服务器
白狐_7986 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2586 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
测试运维日常笔记8 小时前
Linux系统安装配置TigerVNC服务器完整指南
linux·运维·服务器
极创信息8 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒9 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++