Linux设置开机自启动Java程序--三种方式

news/2024/5/5 18:41:47/文章来源:https://blog.csdn.net/weixin_45248492/article/details/126973747

Linux设置开机自启动Java脚本程序

缘起

公司内部的服务器中有个SpringCloud项目需要运行,之前都是通过nohup java-jar .. &的命令来执行的,但是这个cloud项目服务太多,手动启动太麻烦而且容易出错,干脆写个执行java的脚本好了,后面服务器意外宕机,再启动时还需要手动执行脚本,再设置个开机自启动。

实现

psmisc工具

本脚本中使用了killall命令来删除所有正在执行的java进程,那么需要先把一个工具安装下(这个工具提供了3个命令来简化我们的操作,比较实用),如果你的项目脚本中无需这个killall命令,可跳过此段落

提供了3个实用性命令:

  • pstree:以树状形式显示当前用户下正在运行的进程
  • fuser
  • killall:杀进程用的
yum -y install psmisc

安装完毕后,即可使用killall命令了

脚本文件

restart.sh

#!/bin/bash
source /etc/profile
killall -9 java		# 杀掉所有的java程序
nohup java -jar ms-config-2.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳(单位是s)
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]	# 不停循环,直到15s后,执行下一个java程序
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar ms-eureka-1.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]   
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar flower-ms-dfs-1.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]   
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done

文件解读:

以3个服务为例,先刷新下环境变量,然后杀掉所有启动的Java程序,然后执行nohup java -jar ... &启动java程序,15s后再去启动第二个java程序,以此类推,内容非常简单。

方式一

  • 先编写好sh运行的脚本命令,如上面的restart.sh文件,需要注意的一点是,上面的restart.sh文件中,第二行要记得# chkconfig: 345 99 10,当Linux开机启动后,将执行我们自定义的脚本命令

  • 将脚本执行文件放到/etc/init.d目录下

    mv ./restart.sh /etc/init.d/
    
  • restart.sh文件添加可执行权限

    chmod 777 restart.sh
    
  • 注册我们的脚本命令

    chkconfig --add restart.sh
    

    文件中一定要记得写**# chkconfig**的内容,否则注册时会报错。

完整的脚本文件贴出来

#!/bin/bash
# chkconfig: 345 99 10
source /etc/profile
killall -9 java		# 杀掉所有的java程序
# 执行时记得找到自己jar包的全路径
nohup java -jar /home/myapp/ms-config-2.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳(单位是s)
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]	# 不停循环,直到15s后,执行下一个java程序
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar /home/myapp/ms-eureka-1.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]   
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar /home/myapp/flower-ms-dfs-1.0-SNAPSHOT.jar &
ti1=`date +%s`    #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]   
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done

完毕后,重启服务器尝试即可。

方式二

  • Linux系统启动时需要加载/etc/profile/etc/bashrc/etc/rc.d/rc.local等配置文件,我们可以在/etc/rc.d/rc.local文件中写入我们要执行的命令、或者我们将要执行的脚本写入即可。如例子:

在这里插入图片描述

  • 修改文件执行权限

    chmod +x /etc/rc.d/rc.local
    

重启服务器尝试即可。

方式三(推荐使用)

使用方式

自定义服务文件,添加到系统服务中,通过systemctl进行管理

  • /usr/lib/systemd/system/目录下新建一个文件,如app.service文件

    注意文件中的所有地方都要用绝对路径来写,否则报错。

    [Unit]
    Description=Process Monitoring and Control Daemon
    After=rc-local.service nss-user-lookup.target[Service]
    Type=forking
    ExecStart=/root/20220921restart.sh
    PrivateTmp=True[Install]
    WantedBy=multi-user.target
  • 完成后,可以用systemctl命令进行管理了

    systemctl start app # 启动app服务
    systemctl status app # 查看app服务状态
    systemctl enable app # 开机自启动 app
    systemctl disable app # 关闭开机自启动 app# 列出所有开机自启动的服务
    systemctl list-unit-files --type=service | grep enabled
    

文件各配置详解

[Unit]区块:

  • Description : 服务描述
  • After:表示在某些服务启动后启动
  • Before字段:定义xxx.service应该在哪些服务之前启动。

[Service]区块:注意全部要用绝对路径!!!

  • ExecStart字段:定义启动进程时执行的命令

  • ExecReload字段:重启服务时执行的命令

  • ExecStop字段:停止服务时执行的命令

  • ExecStartPre字段:启动服务之前执行的命令

  • ExecStartPost字段:启动服务之后执行的命令

  • ExecStopPost字段:停止服务之后执行的命令

  • Type :启动类型:

    • forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)
    • simple(默认值):ExecStart字段启动的进程为主进程
    • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务

[Install]区块:

  • WantedBy:表示该服务所在的 Target。

    WantedBy=multi-user.target指的是:sshd 所在的 Target 是multi-user.target。
    这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

总结:

方式三管理地更加全面一点,可以用systemctl来进行管理,当然配置也就较为麻烦点,实际可以根据自己的业务场景来做,我这边有一个场景:一个springcloud项目中有一些服务是用脚本命令来进行管理的,有一部分是通过linux的supervisor进程管理工具来进行管理的,脚本那些管理的都是服务所需的配置、注册中心之类的,必须要在supervisor管理的程序执行前执行,那么我就可以使用第三种方式,且在[Unit]区块中配置Before命令,例子

[Unit]
Description=Process Monitoring and Control Daemon
Before=supervisord.service[Service]
Type=forking
ExecStart=/root/20220921restart.sh
PrivateTmp=True[Install]
WantedBy=multi-user.target

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_11812.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++内存管理(每日更新)

文章目录0 概述0.1 四个层面的基本用法1 Primitives1.1 new expression1.2 delete expression1.3 调用构造函数与析构函数1.4 array new & array delete1.4.1 array new0 概述 C应用程序malloc非常重要 可以看出,C内存管理主要是有四个层面 0.1 四个层面的基本…

NFT重构票务系统

什么是NFT? NFT是运行在区块链上的一种不可分割的凭证(Non-Fungible Token),或者称为非同质化代币。NFT目前主要用在数字艺术品的铸造、拍卖、流转,因为一个NFT能唯一地确定它的所有者,并可在链上跟踪每一…

自然语言语义分析研究进展_笔记

自然语言语义分析研究进展_笔记 词语语义分析:确定词语意义,衡量两个词之间的语义相似度或相关度; 句子语义分析:研究包含句义分析和句义相似度分析两方面; 文本语义分析:识别文本的意义、主题、类别等语义信息的过程&#xff…

使用@JsonFormat并进一步了解:格式化java.util.Date对象

Java 8 Spring Boot 2.7.3 jackson 2.13.3 -- ben发布于博客园 0、前言 开发过程中遇到问题: 前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。 调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。 ben发布于博客园 新建spring …

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉,一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变,共识就是区块链系统中各节点达成数据一致性的算法,正常情况下每个节点需要运行相同规则的算法,例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门,是一家世界级的技术研究和咨询公司,拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…

全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中

如果你关注自动驾驶,那有这样一个算法大赛,值得参与。由卡车自动驾驶领导者嬴彻科技与清华大学智能产业研究院(AIR)精心打造的“嬴彻-清华AIR杯”自动驾驶技术挑战赛正火热开赛中。这是国内首个同时覆盖干线物流和城市道路双赛道的大赛。决策规划是自动驾驶当下的热门方向和技术…

go语言的基本数据类型

基本数据类型中的常量已经介绍了 var const iota 。此处要对字符串特别说明,字符串也会被认为是基本数据类型,字符串实际在底层原理上与复合类型的数据非常相似。同事go语言支持八进制,6进制,科学计数法。空指针的值是nil。 整…

百度地图API

一、百度地图API接入 1、搜索百度地图开发平台 2、注册百度账号 3、登陆并申请成为开发者 4、在百度地图开发平台的首页选择控制台,在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用,其中最重要的是AK,这是百度地图…

从0-1,如何用低代码搭建管理系统

关键字:功能模块、流程中心、OA 前言:对于搭建系统,字眼上都知道是怎么回事,但要怎么搭建到最后怎么呈现一个投入运作的系统,估计就很少人知道了。当然作为专业的程序员肯定知道怎么操作,但是不是必须要专业…

IDEA集成Git

介绍 参考视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?p27 1 配置 Git 忽略文件 1.1为什么要配置 问题 1:为什么要忽略他们? 答:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之 间的差异。…

湖仓一体电商项目(十八):业务实现之编写写入DWD层业务代码

文章目录 业务实现之编写写入DWD层业务代码 一、代码编写 二、​​​​​​​​​​​​​​创建Iceberg-DWD层表 1、在Hive中添加Iceberg表格式需要的包 2、创建Iceberg表 三、代码测试 1、在Kafka中创建对应的topic 2、将代码中消费Kafka数据改成从头开始消费 3、执…

【展馆攻略】展馆室内精准定位导航服务,便捷无忧,所见必达!

近年来,室内定位导航服务被各大商场、园区、景区等场所广泛使用,逐渐融入到人们日常生活中。室内地图从传统的平面信息图发展到智能化3D可视化交互展示,实现了室内综合场景的精准定位导航。 在面对室内或者建筑物遮挡区域,室内导航…

浏览器如何渲染页面?

DOM 浏览器渲染页面的过程就像是盖房子,一般先请求服务器得到HTML文件,HTML文件就相当于网页的框架结构,不过一开始浏览器得到的是显示字节内容的HTML文件,必须要内化为自己看的懂的语言才行,于是就把字节转化为字符&…

vue小案列(hello world)

目录 1 页签图标的报错解决 2 创建vue实例 3 初识Vue分析 1 页签图标的报错解决 1 首先,在我们的html中定义一个容器,然后右键(Open with LIve Server)打开,需要安装LIve Server插件 打开之后发现控制台报如下错误&a…

2022年服装进销存软件排行榜重磅出炉!

小编调研了一下身边做服装行业的老板,普遍反映如今服装实体店越来越难做了,日常经营过程中,难免会遇到各种问题:商品种类多、款式多、库存多、活动多……这些都让老板们应接不暇,尽管每天早出晚归地管理店铺&#xff0…

怎么音频转文字?快把这些方法收好

相信不少的小伙伴,经常需要对自己的录音文件进行整理归纳吧,其中不乏是课堂的重点知识、会议上的重点纪要、谈判中的重点内容。那小伙伴们平时在整理的时候,大概都需要花费多少时间呢?为了能够将音频的内容完整呈现出来&#xff0…

SpringBoot多数据源

使用场景 在实际开发中,可能遇到多数据源的场景。 业务复杂(数据量大) 数据分布在不同的数据库中,对业务数据进行垂直拆分。 可以拆分为微服务架构,依赖的业务可以通过远程调用的方式来是实现,那么这种方…