Linux中Java应用程序的开机自启方案

一、前言

  在五一假期要开始的时候,因为服务器区域供电单位要作业,机房没有足够的UPS,导致服务器要长时间的停电停机。但是业务在假期要使用系统,IT无法提供远程账号,所以只能等来电开启系统,维护服务了。所以计划选择一个方案实现Linux中的Java应用程序实现开机自启动方案。在Windows系统中,一般我们可以通过将应用程序设置为系统服务,然后属性->启动类型设置为自启动方式,服务主机关机后在开机会自动启动设置的系统服务。那么在Linux环境(Centos)下如何实现应用程序的开机自启动?保证不用人为的操作启动应用程序?

二、Systemd模块

  要实现例如Windows的系统服务,先来认识systemd,是Linux系统的一套基本构建模块。它提供了一个系统和服务管理器,作为PID 1运行并启动系统的其余部分,提供积极的并行化功能,使用套接字和D-Bus激活来启动服务,提供按需启动守护进程,使用Linux控制组跟踪进程,维护挂载和自动挂载点,并实现一个精心设计的基于事务依赖的服务控制逻辑,其主要内容如下图所示:

   主要实现的目的是改进表示依赖关系的软件框架,允许在系统引导期间并发或并行地完成更多的处理,并减少shell的计算开销,以取代Linux传统的System V init,与init对比的特征表现如下几点:

  ①与init守护进程一样,systemd是一个管理其他守护进程的守护进程,这些守护进程(包括systemd本身)都是后台进程

  ②systemd是在引导期间启动的第一个守护进程,也是在关闭期间终止的最后一个守护进程。

  ③systemd守护进程作为用户空间进程树的根; 第一个进程(PID 1)在Unix系统上具有特殊的作用,因为当原始父进程终止时,它将替换父进程。

注意:通过上述概念systemd可以使用于守护进程,并且提供按需启动的的守护进程,我们的Java应用程序使用systemed来实现开机自启动的方案。

三、设置服务

  第一步、创建服务文件,相当于Window中创建一个服务,在根目录etc/systemd/system文件夹下,创建一个以.service后缀的服务文件gs-mes-app,如下所示(默认文件包含多个已知的服务文件)。

   第二步、在文件中编写服务内容,以启动Java应用程序为例,主要的参数项内容如下:

复制代码
[Unit]
# 应用描述
Description=XXXX系统
After=network.target
[Service]
# 工作目录
WorkingDirectory=/home/mes/
User=root
# 运行jar包的指令
ExecStart=/usr/java/jdk1.8.0_281-amd64/bin/java -jar -Xmx1536m /home/mes/mes-admin.jar
# 收到正常停止命令时不自动重启(systemctl stop 时不会自动重启)
SuccessExitStatus=143
# 在服务失败时自动重启
Restart=always
# 重启前等待10秒
RestartSec=10
# 重启尝试间隔时间
StartLimitInterval=10
# 间隔时间内的最大重启尝试次数
StartLimitBurst=3

[Install]
WantedBy=multi-user.target
复制代码

   其中ExecStart,/usr/java/jdk1.8.0_281-amd64/bin/java是在Linux环境按照的JDK的目录,/home/mes/mes-admin.jar是运行Java应用程序的JAR包路径,其它参数包括重启等待时长,重启尝试间隔时间,重启尝试次数等。

  第三步、在命令中刷新存放在system文件夹下服务文件,必须在etc/systemd/system中,否则无法加载文件。

sudo systemctl daemon-reload 

  第四步、在命令中启用服务,并且使用在开机自启动,其中enable状态表示开机自启动,disenable表示开机不启动,static表示对应Unit文件中没有定义[Install]区域,因此无法设置开机自启动。

sudo systemctl enable xxxx.service

  第五步、启动服务,则完成systemctl指令管理你的java应用。

# 启动
sudo systemctl start XXX.service
# 停止
sudo systemctl stop XXX.service
# 查看状态
sudo systemctl status  XXX.service

  在命令中可以通过如下命令查看相关systemd的内容

复制代码
#启动一个服务
systemctl start postfix.service
#关闭一个服务
systemctl stop postfix.service
#重启一个服务
systemctl restart postfix.service
#显示一个服务的状态
systemctl status postfix.service
#在开机时启用一个服务
systemctl enable postfix.service
#在开机时禁用一个服务
systemctl disable postfix.service
#查看服务是否开机启动
systemctl is-enabled postfix.service
#查看已启动的服务列表
systemctl list-unit-files|grep enabled
#查看启动失败的服务列表
systemctl --failed
#重新加载service文件
systemctl daemon-reload
复制代码

四、总结

  通过上述方式比较好解决了服务应为意外终止,开机自启动减少人工的维护,当然,这个只是其中的一个解决方案,还可以通过Cron定时任务,或者借助第三方软件比如容器来启动相关服务,解决这个问题。

  参考:https://blog.51cto.com/littledevil/1912570、https://www.jianshu.com/p/d35c23404175、https://blog.csdn.net/weixin_44003789/article/details/136298183

posted @   tuqunfu  阅读(627)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示