Linux配置JAR包为服务实现自启动

一、实现bash脚本

1.1 绘图工具

绘图需安装idea的插件plantUML-Integration

只需要上图一个就可以,别的也不需要装。

启动服务的逻辑如下

关闭服务的逻辑如下

1.2 逻辑实现

在/root路径下创建entrance文件,实现逻辑如下

#!/usr/bin/env bash
# 2>&1的含义
# 1表示标准输出
# 2表示标准错误输出
# 2>&1表示将标准错误输出重定向到标准输出# 配置jar程序的pid保存文件
jar_pid=/root/jar_pid
# 配置jar的绝对路径
jar=/root/http-proxy-boot.jarif [ "$1" = "start" ]; then# 如果jar_pid文件存在if [ -f "$jar_pid" ]; then# 如果jar_pid文件有值if [ -s "$jar_pid" ]; thenecho "Existing PID file found during start."# 如果jar_pid文件可读if [ -r "$jar_pid" ]; thenPID=`cat "$jar_pid"`# 与直接执行命令相比, 这样可以抑制输出ps -p $PID >/dev/null 2>&1# 等于0if [ $? -eq 0 ] ; thenecho "$jar appears to still be running with PID $PID. Start aborted."echo "If the following process is not a $jar process, remove the PID file and try again:"ps -f -p $PIDexit 1elseecho "Removing/clearing stale PID file."# 与直接执行命令相比, 这样可以抑制输出rm -f "$jar_pid" >/dev/null 2>&1if [ $? != 0 ]; then# 可写权限if [ -w "$jar_pid" ]; thencat /dev/null > "$jar_pid"elseecho "Unable to remove or clear stale PID file. Start aborted."exit 1fififielseecho "Unable to read PID file. Start aborted."exit 1fielserm -f "$jar_pid" >/dev/null 2>&1if [ $? != 0 ]; thenif [ ! -w "$jar_pid" ]; thenecho "Unable to remove or write to empty PID file. Start aborted."exit 1fifififi# 将命令行参数往前移一个. 比如sh test.sh 1 2, 在shift前, $1=1 $2=2, 在shift后, $1=2shift# eval是将字符串解析为命令执行,如 eval "ls -l"就相当于直接运行性ls -leval "nohup java -jar \$jar >/dev/null 2>&1 &"# 将pid写入到jar_pid文件中echo $! > "$jar_pid"echo "$jar started."
elif [ "$1" = "stop" ]; thensleep=5# 当force为1时, 执行kill -9force=0shift# 若文件存在if [ -f "$jar_pid" ]; then# 若jar_pid有值if [ -s "$jar_pid" ]; then# kill -0不影响进程执行,而是检查进程是否正在运行kill -0 `cat "$jar_pid"` >/dev/null 2>&1# 如果大于0表示异常if [ $? -gt 0 ]; thenecho "PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted."exit 1fielseecho "PID file is empty and has been ignored."fielseecho "$jar_pid was set but the specified file does not exist. Is $jar running? Stop aborted."exit 1fi# 与直接kill -15相比, 这样可以抑制输出kill -15 `cat "$jar_pid"` >/dev/null 2>&1if [ -f "$jar_pid" ]; thenwhile [ $sleep -ge 0 ]; do# kill -0不影响进程执行,而是检查进程是否正在运行kill -0 `cat "$jar_pid"` >/dev/null 2>&1# 如果大于0表示异常, 表示进程已被关闭if [ $? -gt 0 ]; thenrm -f "$jar_pid" >/dev/null 2>&1# 如果删除失败if [ $? != 0 ]; thenif [ -w "$jar_pid" ]; thencat /dev/null > "$jar_pid"force=0elseecho "The PID file could not be removed or cleared."fifiecho "$jar stopped."breakfiif [ $sleep -gt 0 ]; thensleep 1fiif [ $sleep -eq 0 ]; thenecho "$jar did not stop in time."if [ $force -eq 0 ]; thenecho "PID file was not removed."fiecho "To aid diagnostics a thread dump has been written to standard out."# kill -3 与 kill -15 类似, 只是kill -3 会多了一步生成核心存储,用于后续调试。kill -3适用于程序无响应时kill -3 `cat "$jar_pid"`fi# 自减sleep=`expr $sleep - 1`donefiKILL_SLEEP_INTERVAL=5if [ $force -eq 1 ]; thenif [ -f "$jar_pid" ]; thenPID=`cat "$jar_pid"`echo "Killing $jar with the PID: $PID"kill -9 $PIDwhile [ $KILL_SLEEP_INTERVAL -ge 0 ]; dokill -0 `cat "$jar_pid"` >/dev/null 2>&1if [ $? -gt 0 ]; thenrm -f "$jar_pid" >/dev/null 2>&1if [ $? != 0 ]; thenif [ -w "$jar_pid" ]; thencat /dev/null > "$jar_pid"elseecho "The PID file could not be removed."fifiecho "The $jar process has been killed."breakfiif [ $KILL_SLEEP_INTERVAL -gt 0 ]; thensleep 1fiKILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `doneif [ $KILL_SLEEP_INTERVAL -lt 0 ]; thenecho "$jar has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."fififi
elseecho "commands:"echo " start      Start jar"echo " stop       Stop jar"
fi

启动和关闭命令如下

sh /root/entrance start
sh /root/entrance stop

二、配置systemd服务

使用systemd的好处时,他由系统管理,统一的管理命令,而且可以支持自启动等操作。

延用上面的bash脚本,创建systemd服务

cat > /usr/lib/systemd/system/http-proxy-boot.service <<EOF
[Unit]
Description=http-proxy-boot
After=network.target
[Service]
Type=forking
# restart时, 先执行ExecStop, 再执行ExecStart
ExecStart=/root/entrance start
ExecStop=/root/entrance stop
PrivateTmp=true
# kill按理说,应该返回状态0,但是java比较特殊,返回的是143
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
EOF

之后就可以进行操作啦

systemctl start|stop|restart|enable|disable http-proxy-boot

三、参考致谢

如何在统信UOS系统中设置tomcat开机启动_统信uos系统部署tomcat-CSDN博客

tomcat/bin/catalina.sh at main · apache/tomcat

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

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

相关文章

电子学会C/C++编程等级考试2023年09月(四级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:酒鬼 Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴的是,瓶子中的酒都有不同的味道。房东说道:“你可以喝尽…

SpringMVC(六)RESTful

1.RESTful简介 REST:Representational State Transfer,表现层资源状态转移 (1)资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件…

调用Clarifai API提取图像特征

官方文档放前面&#xff1a;Images | Clarifai Guide 功能很多&#xff0c;有各种不同的模型&#xff0c;可以提取不同的图像特征&#xff0c;比如图像摘要、图像实体等。。。 具体的调用过程&#xff1a; 1.进入官方网站Full Stack AI Developer Platform: Production Compu…

Vue基知识四

本文对前边几章所学习的内容&#xff0c;以案例的形式做一个总结 一 TodoList案例 即待办事项案例&#xff0c;效果如下 1.1 组件化编码流程&#xff08;通用&#xff09; 这是编码时的通用流程&#xff0c;以后也可以按照这个流程来写代码&#xff08;熟悉后这个流程的顺…

从0到1:如何建立一个大规模多语言代码生成预训练模型

国产AI辅助编程工具 CodeGeeX 是一个使用AI大模型为基座的辅助编程工具&#xff0c;帮助开发人员更快的编写代码。可以自动完成整个函数的编写&#xff0c;只需要根据注释或Tab按键即可。它已经在Java、JavaScript和Python等二十多种语言上进行了训练&#xff0c;并基于大量公开…

数据分享|纯净音自然多轮对话数据集——语音大模型

在过去的一年里&#xff0c;大语言模型一路高歌猛进&#xff0c;让人惊艳的产品不断被推出。语音大模型也迎来突破&#xff0c;其中就包括还原度越来越高的声音复刻技术。 优秀的语音复刻性能离不开高质量的训练数据支撑。语音大模型构建需要大量的自然数据&#xff0c;尽可能…

优化 - 重构一次Mysql导致服务器的OOM

概述 优化了一次前后端处理不当导致的CPU的一次爆机行为&#xff0c;当然&#xff0c;这和服务器的配置低也有着密不可分的关系&#xff0c;简单的逻辑学告诉我们&#xff0c;要找到真正的问题&#xff0c;进行解决&#xff0c;CPU爆机的关键点在于前后端两个方面&#xff0c;…

【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《图形学 | 图像解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f30c;1. 初识模式识别…

79LXX 三端负电源电压调节器,具有一系列固定电压输出,适用于小于100mA电源供给的场合

79LXX系列三端负电源电压调节器是单片双极型线性集成电路&#xff0c;采用TO92、SOT89-3的封装形式封装&#xff0c;有一系列固定的电压输出&#xff0c;适用于小于100mA电源供给的场合。 主要特点&#xff1a; 最大输出电流为100mA 固定输出电压分别为-5V、-6V、-8V、-9V、-1…

java智慧校园小程序源码,家校互通小程序源码,智慧校园电子班牌云平台源码

智慧校园云平台电子班牌系统&#xff0c;利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现基础数据共享、应用统一管理。借助全新的智能交互识别终端和移动化教育管理系统&#xff0c;以考勤、课表、通知、家校互通等功能为切入点…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道&#xff0c;跨网络通信需要路由 路由有三种类型&#xff1a; 1.直连路由。 自动产生的路由&#xff0c;当网络设备连接到同一网络时&#xff0c;他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

【降龙算法】基于QT插件机制实现一个机器视觉算法小框架

机器视觉行业有各种各样的拖拉拽框架&#xff0c;也叫做低代码平台&#xff0c;例如国内海康的VisionMaster&#xff1a; 一个机器视觉框架需要包含各种算法模块&#xff0c;日志窗口&#xff0c;图像显示窗口等等&#xff0c;【降龙算法】就是做了一个入门级的机器视觉算法框…