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 秒,防止频繁失败占用资源。StandardOutput和StandardError:将标准输出和错误都追加到指定的日志文件中(替代原来的> 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:应用需要读取环境变量怎么办?
使用 Environment 或 EnvironmentFile 指定,例如:
ini
EnvironmentFile=/home/fr1511b/ishz/env.conf
然后在 env.conf 中写入 KEY=value 形式的变量。
七、总结
通过 systemd 管理 Jar 包应用是生产环境的标准做法,不仅实现了开机自启,还提供了进程守护、日志统一管理、方便启停等优势。
只需简单的几步即可替代传统的 nohup 手动启动方式,推荐大家使用。