Linux系统制作Java JAR程序为系统服务

在Linux系统中,将JAR程序制作成系统服务可以通过系统自带的systemd服务管理器来实现。systemd是现代Linux系统中广泛使用的初始化系统和服务管理器,它提供了强大的功能来管理系统的启动和服务。

以下是将JAR程序制作成systemd系统服务的步骤,这些步骤展示了如何使用systemd这一"组件"(实际上是Linux系统的一个核心部分)来完成任务:

  1. 准备JAR程序

    • 确保你的JAR程序是可执行的,并且已经放置在Linux系统中的某个目录下。
  2. 创建systemd服务文件

    • 进入/etc/systemd/system目录。
    • 创建一个新的服务文件,例如myjarapp.service,其中myjarapp是你的服务名称。
  3. 编辑服务文件

    • 在服务文件中添加以下内容,根据你的实际情况进行修改:

      ini 复制代码
      [Unit]
      Description=My JAR Application Service
      After=syslog.target
      
      [Service]
      Type=simple
      ExecStart=/usr/bin/java -jar /path/to/your/application.jar
      WorkingDirectory=/path/to/your/application
      User=yourusername
      Group=yourgroupname
      Restart=on-failure
      
      [Install]
      WantedBy=multi-user.target
    • ExecStart:指定启动JAR程序的命令。

    • WorkingDirectory:指定JAR程序的工作目录(可选)。

    • UserGroup:指定运行JAR程序的用户和组(可选)。

    • Restart=on-failure:如果服务失败,则自动重启。

  4. 重新加载systemd配置

    • 运行sudo systemctl daemon-reload命令,以重新加载systemd的配置。
  5. 启动和管理服务

    • 启动服务:sudo systemctl start myjarapp.service
    • 停止服务:sudo systemctl stop myjarapp.service
    • 检查服务状态:sudo systemctl status myjarapp.service
    • 查看服务日志:journalctl -u myjarapp.service
  6. 设置开机自启动

    • 启用开机自启动:sudo systemctl enable myjarapp.service
    • 检查开机自启动状态:sudo systemctl list-unit-files | grep myjarapp.service

通过这些步骤,你可以将JAR程序制作成Linux系统的服务,并方便地进行管理和控制。这种方法利用了Linux系统自带的systemd功能,无需额外的组件或工具。

另外,但值得注意的是,使用systemd时,你可以通过编辑服务文件来灵活地配置服务的各种属性和行为,如依赖关系、启动顺序、资源限制等。这使得systemd成为一个强大且灵活的服务管理工具。

多说一句:

在systemd的服务文件中的[Service]节中,可以看到有ExecStart命令,但是却没有STOP命令。但这不影响systemd停止服务。

systemd通过发送特定的信号给服务进程来请求它停止。这通常是通过向进程发送SIGTERM(终止信号)来实现的,如果进程没有在规定的时间内响应,systemd可能会发送SIGKILL(强制终止信号)来强制停止它。

在[Service]部分中,ExecStart命令用于启动服务,而停止服务的逻辑是由systemd内部处理的,基于服务的类型和运行状态。当你运行sudo systemctl stop myjarapp.service命令时,systemd会负责找到服务的进程ID(PID),并发送适当的信号来请求它停止。

对于Java应用程序(特别是那些作为JAR文件运行的),当接收到SIGTERM信号时,它们通常不会立即退出,因为Java虚拟机(JVM)默认不会立即响应这个信号。因此,你可能需要在你的Java应用程序中添加一些代码来监听这个信号,并优雅地关闭应用程序(例如,通过关闭数据库连接、释放资源、停止线程等)。这通常可以通过在Java应用程序中使用信号处理库或框架来实现,或者通过注册一个关闭钩子(shutdown hook)来响应JVM的关闭事件。

然而,如果你的Java应用程序没有处理SIGTERM信号的逻辑,那么systemd在发送SIGTERM后等待一段时间(这个时间可以通过TimeoutStopSec选项在服务文件中配置)后,将会发送SIGKILL信号来强制终止进程。

总之,尽管在systemd的服务文件中没有Stop命令,但systemd仍然能够停止服务,这是通过发送适当的信号给服务进程来实现的。对于Java应用程序,你可能需要在代码中添加一些逻辑来优雅地处理这些信号。

相关推荐
向宇it4 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行6 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
滴水之功42 分钟前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java