随记:1、服务器启动时服务自启以及服务异常退出后自行启动
0、场景说明:
前些天的工作中,公司的内部服务器维护频繁,导致博主自己维护的一个内部系统常常需要手动启动,虽然也就是java -jar,但是做为一个已经成年的系统它应该知道自食其力了(其实就是博主比较懒)
好了,废话不多说,先来梳理一下思路
1、实现思路:
服务器启动时服务自启:这个需求,我依稀记得服务器是可以将服务注册到开机自启服务中的,ok,这个功能就使用这个方式去实现。
服务异常退出后自行启动:我们可以通过监控服务的进程是否存在来判断该服务是否已经挂掉,通过Linux自带的定时任务Crontab来定时查询该服务的进程,挂掉就启动一下,没挂掉就不操作。
思路大概就是这样,实现的方式应该有很多,因为此系统是为公司内部开发人员使用的,没有太多的要求,简单实现即可,博主使用最浅显的的实现,不做过多的操作
2、实现过程:
首先我们需要编写两个shell脚本,即服务器启动时自启时执行的脚本和异常退出后自启时执行的脚本
服务器启动时自启:
(创建脚本文件,名称自定义即可,后缀必须是 .sh 结尾,我是在存放jar包文件目录的文件夹里创建了sh文件夹存放脚本,自行选择即可)
命名为:serverRestart.sh
#! /bin/bash
#固定语法 使用bin目录下的bash运行该脚本
ps -ef | grep demoProxy.jar | grep -v grep #查询该服务的进程
if [ $? -ne 0 ]; #判断为0即没有该服务 不为0即查询到该服务
then
#没有该服务就运行启动命令 java -jar ***.jar
#shell脚本中必须使用绝对路径 不然无法正常运行
nohup /usr/local/jdk8u332-b09-jre/bin/java -jar /home/jar/demoProxy.jar >> /home/jar/serverLog.txt &
else
#有该服务就杀掉进程 后执行启动命令
kill -9 `ps -ef | grep demoProxy.jar | grep -v grep | awk '{print $2}'`
nohup /usr/local/jdk8u332-b09-jre/bin/java -jar /home/jar/demoProxy.jar >> /home/jar/serverLog.txt &
fi
执行下面的命令,开启该脚本的执行权限:
chmod +x /home/sh/serverRestart.sh
然后将该脚本写入官方提供的开机自启程序中
vi /etc/rc.local
在编辑的界面添加一段
/home/sh/serverRestart.sh #该命令为shell脚本的执行命令
重启服务器,进行验证
shutdown -r now #立即重启服务器
ps -ef | grep java #查询java的进程 如果服务器中java程序多的话,可以直接输入***.jar进行精确查询
异常退出后自启
创建shell脚本,博主命名为:exceptionRestart.sh
(代码和第一个脚本的逻辑相同,查到进程不操作,查不到时就运行脚本启动服务)
#! /bin/bash
ps -ef | grep demoProxy.jar | grep -v grep
if [ $? -ne 0 ];
then
nohup /usr/local/jdk8u332-b09-jre/bin/java -jar /home/jar/demoProxy.jar >> /home/jar/exceptionLog.txt &
fi
执行下面的命令,开启该脚本的执行权限:
chmod +x /home/jar/exceptionRestart.sh
设置定时任务
#进入定时任务编辑页面
crontab -e
#在编辑页面添加定时任务 添加后保存退出
#此命令的含义为每隔一分钟 执行一次exceptionRestart.sh脚本
*/1 * * * * /home/sh/exceptionRestart.sh >> /home/sh/cron/cronlog.txt 2>1&
#查看定时任务 显示出刚刚添加的命令表示添加成功
crontab -l
验证
ps -ef | grep java
#有进程就使用 kill -9 进程号 删掉进程等待一分钟再查询一次 验证定时任务是否可用
3、写在最后
emmmm~~
声明一下,博主在此之前是没有自己编写过shell脚本的,突发奇想的做这件事情,顺带学习了一下shell的基础语法,可能会写的不优雅或者可能有错误,仅供参考,关于文章中没有说明的语法,朋友们可以自行百度查一下,就不在此一一说明了。
其次,博主也是百度加自己理解做出来的功能,并不算是原创,只是我觉得他们写的没那么容易理解,我自己写一篇较为容易理解的,写篇学习的随记便于记忆,不喜勿喷。
最后,本文是我的第一篇博客,肯定存在很多不足,实现思路、方式、又或者并不是最佳实现、写文章的方式...等等方面的问题,如果有大佬愿意指点我的话,小弟在此感激不尽。
(注:博主做开发的时间不长,技术方面没有那么高深,也是在不断的学习中并且为了养成总结笔记的习惯才选择写博客!)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!