如何将java -jar启动的服务设置为systemd服务管理方式

 更新时间:2025年01月03日 15:09:01   作者:学亮编程手记  
本文详细介绍了如何将Java应用程序配置为由systemd管理的服务,包括创建和配置.service文件的步骤,以及如何启动、停止和查看服务状态

要将一个使用 java -jar 命令启动的服务设置为由 systemd 进行管理,你需要创建一个 .service 文件并将其放置在 /etc/systemd/system/ 目录下。

以下是创建和配置这样一个服务文件的详细步骤:

步骤 1: 准备工作

确定Java环境

确保系统中已经安装了Java,并且知道Java的安装路径(如 /usr/lib/jvm/java-1.8.0-openjdk-amd64/usr/java/jdk1.8.0_211)。可以通过命令 which java 查找实际的可执行文件路径。

准备JAR文件

确认你的Java应用程序的JAR文件路径,例如 /opt/services/myapp/myapp.jar。确保该JAR文件具有适当的权限,使得 systemd 用户(通常为 root 或者 system 用户组)能够访问。

步骤 2: 创建.service文件

使用文本编辑器(如 vi, nano, 或 gedit),创建一个名为 myapp.service 的文件,将其保存在 /etc/systemd/system/ 目录下。

以下是一个基本的 .service 文件模板:

[Unit]
Description=My Java Application Service
After=network.target

[Service]
User=<非root用户>  # 如果需要以非root用户运行,填写用户名;否则可以省略此行
Group=<用户组>     # 如果需要指定用户组,填写用户组名;否则可以省略此行

Restart=on-failure  # 当服务崩溃时自动重启
RestartSec=10s      # 重启前等待10秒

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64"
Environment="JAR_FILE=/opt/services/myapp/myapp.jar"

ExecStart=/usr/bin/java -jar $JAR_FILE
ExecStop=/bin/kill -SIGTERM $MAINPID

[Install]
WantedBy=multi-user.target

说明:

[Unit] 部分:

  • Description: 提供服务的简短描述。
  • After: 指定服务应在哪些服务之后启动,这里设置为在网络服务 (network.target) 完成后启动。

[Service] 部分:

  • UserGroup: 如果希望服务以非 root 用户和用户组运行,指定相应的用户名和用户组名。
  • RestartRestartSec: 设置当服务崩溃时自动重启策略,这里是 on-failure 表示失败时重启,RestartSec 指定了重启前等待的时间。
  • Environment: 设置环境变量,这里指定了 JAVA_HOME(Java安装路径)和 JAR_FILE(应用程序JAR文件路径)。
  • ExecStart: 定义启动服务的命令,使用 java -jar 命令启动指定的JAR文件,通过 $JAR_FILE 引用之前定义的环境变量。
  • ExecStop: 定义停止服务的命令,这里使用 kill 命令发送 SIGTERM 信号给主进程ID($MAINPID),以优雅地关闭服务。

[Install] 部分:

  • WantedBy: 指定服务应随哪个目标(target)启动。
  • 这里设置为 multi-user.target,意味着在多用户系统(非单用户模式或图形界面)启动时,该服务会被自动启动。

步骤 3: 配置服务

更新服务配置

执行以下命令,使 systemd 重新加载配置文件:

sudo systemctl daemon-reload

启用服务

若要让服务在系统启动时自动运行,执行:

sudo systemctl enable myapp.service

启动服务

立即启动服务:

sudo systemctl start myapp.service

检查服务状态

确认服务是否正常运行:

sudo systemctl status myapp.service

如果一切正常,你应该能看到服务状态为 active (running)

附加说明

日志管理

默认情况下,服务的标准输出和错误输出将被重定向到 systemd 的 journal。你可以使用 journalctl 命令查看服务的日志:

journalctl -u myapp.service

自定义启动参数

如果你的Java应用需要额外的启动参数,可以在 ExecStart 行中直接添加,例如:

ExecStart=/usr/bin/java -jar $JAR_FILE --param1=value1 --param2=value2

权限与限制

根据需要,你还可以在 [Service] 部分设置资源限制(如内存、CPU限制)、工作目录、文件描述符限制等。查阅 systemd.exec(5) 手册页了解更多信息。

完成以上步骤后,你的Java应用程序就已成功配置为由 systemd 管理的服务,可以方便地进行启动、停止、重启以及查看状态和日志。

需要使用nohup保持后台运行吗

在使用 systemd 管理服务的情况下,通常不需要使用 nohup 命令来保持服务在后台运行。

systemd 已经提供了完善的后台服务管理机制,它能够确保服务进程在后台持续运行,并在必要时根据配置自动重启服务。

在上述 myapp.service 示例中,ExecStart 参数定义了启动服务的命令:

ExecStart=/usr/bin/java -jar $JAR_FILE

这里直接使用 java -jar 命令启动Java应用程序,无需加上 nohupsystemd 会负责管理这个进程的生命周期,确保它在后台运行,不受终端会话影响,并在服务停止时正确清理资源。

因此,当您按照上述步骤将Java应用程序配置为 systemd 服务后,就不需要再使用 nohup 命令来保持其后台运行。systemd 提供的稳定性和可靠性足以满足大多数生产环境的需求。

如果您在Jenkins Pipeline中需要启动这个服务,可以直接调用 systemctl start myapp.service,而不是使用 nohup java -jar ... &

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring6代理模式和AOP示例详解

    spring6代理模式和AOP示例详解

    本文主要介绍了Spring框架中的JdbcTemplate、代理模式和面向切面编程(AOP)的概念、原理和实现方式,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2026-02-02
  • Jenkins Pipeline为Kubernetes应用部署增加状态检测脚本优化

    Jenkins Pipeline为Kubernetes应用部署增加状态检测脚本优化

    这篇文章主要为大家介绍了Jenkins Pipeline为Kubernetes应用部署增加状态检测脚本优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java PriorityQueue优点和缺点面试精讲

    Java PriorityQueue优点和缺点面试精讲

    这篇文章主要为大家介绍了Java面试中PriorityQueue的优点和缺点及使用注意详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • JAVA实现线程的三种方法

    JAVA实现线程的三种方法

    这篇文章介绍了JAVA实现线程的三种方法,有需要的朋友可以参考一下
    2013-09-09
  • Rocketmq事务消息之半消息详解

    Rocketmq事务消息之半消息详解

    这篇文章主要介绍了Rocketmq事务消息之半消息详解,RocketMQ的事务消息支持在业务逻辑与发送消息之间提供事务保证,RocketMQ通过两阶段的方式提供事务消息的支持,需要的朋友可以参考下
    2023-09-09
  • Spring中的事务隔离级别的介绍

    Spring中的事务隔离级别的介绍

    今天小编就为大家分享一篇关于Spring中的事务隔离级别的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 解读Spring定义Bean的两种方式:<bean>和@Bean

    解读Spring定义Bean的两种方式:<bean>和@Bean

    这篇文章主要介绍了Spring定义Bean的两种方式:<bean>和@Bean,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Springboot实现过滤器的两种方式

    Springboot实现过滤器的两种方式

    今天通过本文给大家分享Springboot实现过滤器的两种方式,第一种是spring容器注册filter,第二种方式是通过@WebFilter 注解来配置,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • java通过证书访问etcd的实现步骤

    java通过证书访问etcd的实现步骤

    Etcd提供了多种语言的客户端库,本文主要介绍了java通过证书访问etcd的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 配置了jdk的环境idea却提示找不到jdk解决办法

    配置了jdk的环境idea却提示找不到jdk解决办法

    在使用Java编程语言进行开发时,IDEA是一个非常流行和强大的集成开发环境,这篇文章主要给大家介绍了关于配置了jdk的环境idea却提示找不到jdk的解决办法,需要的朋友可以参考下
    2023-12-12

最新评论