前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【随笔】如何将任意 Java 程序转换为 Linux 系统服务

【随笔】如何将任意 Java 程序转换为 Linux 系统服务

作者头像
框架师
发布2025-03-06 09:13:04
发布2025-03-06 09:13:04
9000
代码可运行
举报
文章被收录于专栏:墨白的Java基地墨白的Java基地
运行总次数:0
代码可运行

✨ 前言

最近接收了一个老项目, 项目使用 SpringBoot 1.5 版本,Java 8 开发环境, 需要部署在 Ubuntu 服务器, 接手之前还在使用原始的 nohup 方式启动应用, 那么简单改造一下吧!

🚀 脚本内容

写一个 install.sh 脚本,内容如下:

代码语言:javascript
代码运行次数:0
复制
#!/bin/bash

# 获取用户输入的 jar 包路径
read -p "请输入你的 Java 程序的 jar 包路径:" JAR_PATH

# 检查 jar 包是否存在
if [ ! -f "$JAR_PATH" ]; then
    echo "错误: 指定的 jar 包不存在!"
    exit 1
fi

# 获取 jar 包名称作为服务名
SERVICE_NAME=$(basename "$JAR_PATH" .jar)

# 查找 JDK 安装目录
JAVA_HOME=$(readlink -f $(which java) | sed "s:/bin/java::")

# 检查是否找到 JDK
if [ -z "$JAVA_HOME" ]; then
    echo "错误: 未找到 Java 环境,请确保已安装 JDK!"
    exit 1
fi

# 创建 systemd 服务配置
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"

sudo bash -c "cat > $SERVICE_FILE << EOL
[Unit]
Description=$SERVICE_NAME Java Service
After=network.target

[Service]
User=root
WorkingDirectory=$(dirname "$JAR_PATH")
ExecStart=$JAVA_HOME/bin/java -jar $JAR_PATH
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOL"

# 重新加载 systemd 并启用服务
sudo systemctl daemon-reload
sudo systemctl enable $SERVICE_NAME
sudo systemctl start $SERVICE_NAME

# 显示服务状态
sudo systemctl status $SERVICE_NAME

echo "$SERVICE_NAME 服务已成功创建并启动!"
# 提示用户常用命令
echo "\n服务已配置完毕!以下是常用命令:"
echo "启动服务: sudo systemctl start $SERVICE_NAME"
echo "停止服务: sudo systemctl stop $SERVICE_NAME"
echo "重启服务: sudo systemctl restart $SERVICE_NAME"
echo "查看日志: sudo journalctl -u $SERVICE_NAME"
echo "开机自启: sudo systemctl enable $SERVICE_NAME"
echo "取消开机自启: sudo systemctl disable $SERVICE_NAME"
echo "查看服务状态: sudo systemctl status $SERVICE_NAME"

🎯 脚本功能概述

这个脚本的功能是:

  1. 自动检测 JDK 版本和安装路径
  2. 生成 Systemd 服务单元文件
  3. 启用、启动、重启、停止 Java 服务
  4. 方便开发者通过 jar 包路径配置服务

⚙️ 使用方法

复制脚本到你的 Linux 服务器

赋予执行权限

代码语言:javascript
代码运行次数:0
复制
sudo chmod +x install.sh

执行脚本

代码语言:javascript
代码运行次数:0
复制
sudo ./install.sh

输入 jar 包路径 ,例如:

代码语言:javascript
代码运行次数:0
复制
 请输入你的 Java 程序的 jar 包路径: /home/user/demo.jar

脚本会自动生成一个以 jar 包名命名的 systemd 服务,并启动它!

🏎️ 常用命令

脚本生成的服务之后,你就可以使用这些命令管理 Java 服务:

启动服务

代码语言:javascript
代码运行次数:0
复制
sudo systemctl start 服务名

停止服务

代码语言:javascript
代码运行次数:0
复制
sudo systemctl stop 服务名

重启服务

代码语言:javascript
代码运行次数:0
复制
sudo systemctl restart 服务名

查看状态

代码语言:javascript
代码运行次数:0
复制
sudo systemctl status 服务名

开机自启

代码语言:javascript
代码运行次数:0
复制
sudo systemctl enable 服务名

取消自启

代码语言:javascript
代码运行次数:0
复制
sudo systemctl disable 服务名

🐧 卸载服务

代码语言:javascript
代码运行次数:0
复制
#!/bin/bash

# 获取用户输入的 jar 包路径
read -p "请输入你的 Java 程序的 jar 包路径:" JAR_PATH

# 检查 jar 包是否存在
if [ ! -f "$JAR_PATH" ]; then
    echo "错误: 指定的 jar 包不存在!"
    exit 1
fi

# 获取 jar 包名称作为服务名
SERVICE_NAME=$(basename "$JAR_PATH" .jar)

# 检查 systemd 服务文件是否存在
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
if [ ! -f "$SERVICE_FILE" ]; then
    echo "错误: 未找到 $SERVICE_NAME 的 systemd 服务配置文件!"
    exit 1
fi

# 停止服务
sudo systemctl stop $SERVICE_NAME

# 禁用服务
sudo systemctl disable $SERVICE_NAME

# 删除 systemd 服务配置
sudo rm -f "$SERVICE_FILE"

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

# 提示用户操作完成
echo "$SERVICE_NAME 服务已成功卸载!"

# 提示用户常用命令
echo "\n如需确认服务是否已移除,请使用以下命令:"
echo "查看服务状态: sudo systemctl status $SERVICE_NAME"
echo "检查是否仍在开机启动列表: sudo systemctl list-unit-files | grep $SERVICE_NAME"

期待你的评论和反馈!😊

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ✨ 前言
  • 🚀 脚本内容
  • 🎯 脚本功能概述
  • ⚙️ 使用方法
  • 🏎️ 常用命令
  • 🐧 卸载服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档