第一弹:服务器启动时服务自启以及服务异常退出后自行启动

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的基础语法,可能会写的不优雅或者可能有错误,仅供参考,关于文章中没有说明的语法,朋友们可以自行百度查一下,就不在此一一说明了。

其次,博主也是百度加自己理解做出来的功能,并不算是原创,只是我觉得他们写的没那么容易理解,我自己写一篇较为容易理解的,写篇学习的随记便于记忆,不喜勿喷。

最后,本文是我的第一篇博客,肯定存在很多不足,实现思路、方式、又或者并不是最佳实现、写文章的方式…等等方面的问题,如果有大佬愿意指点我的话,小弟在此感激不尽。

(注:博主做开发的时间不长,技术方面没有那么高深,也是在不断的学习中并且为了养成总结笔记的习惯才选择写博客!)

你可能感兴趣的:(奇葩需求,服务器,linux,运维)