这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
使用shell脚本进行简单的服务运行状态监控
前文
本文为个人服务器上使用的一个简单服务监控方案,主要内容为通过crontab进行定时任务查询,判断当前服务的启动状态,由此判断服务当前是否正常运行。如果服务运行状态异常,则对服务进行重启操作。
问题背景
由于服务在某些情况下会出现崩溃的问题,或由于机器的断电等,会被迫将服务关闭。因此在这种情况下,需要增加一个脚本,对服务进行自动重启操作。
解决方案
crontab定时任务
由于需要进行实时的监控处理,因此选择了crontab作为定时任务的发起。通过crontab的操作,可以保证在机器运行的背景下,脚本按时间间隔反复执行,以此达到监控的状态。在脚本中采用死循环操作也可以,本文暂时采用crontab定时任务。crontab代码如下:
*/2 * * * * /usr/bin/sh /opt/iiot/back_end/scripts/iotCrontab.sh
每隔两分钟,通过crontab对脚本进行拉起执行。
脚本监控
下面来看实际的监控脚本,由于篇幅原因,脚本中的注释、日志、基础信息等内容都已删除,保留了主体思路。首先是采用数组,对需要监控的一组服务进行预设。保存后对数组进行循环遍历。对于每个服务,首先通过ps命令结合awk命令获取服务当前的端口号。由于服务此时可能是崩溃状态或未启动状态,因此还需要将获得的端口号,利用netstat命令获取当前的监听状态。只有当监听状态为LISTEN同时连接为TCP6时,才是正常的运行状态。如果不满足该条件,则语句的输出为0.此时便重新执行启动服务命令,指定日志并利用nohup将其挂载在服务后台执行。具体的监控代码如下:
#! /bin/bash
. /etc/profile
for((i=0;i<${#serverArray[@]};i++)) do
server=${serverArray[i]}
port=$(ps -aux |grep $server|head -n 1|awk '{print $2}')
status=$(netstat -nltp |grep "$port"|awk '$(NF-1) == "LISTEN" && $1 == "tcp6"'|wc -l)
name=${serverNameArray[i]}
log=${logArray[i]}
if [ $status -eq 0 ]
then
{
cd /opt/iiot/back_end && nohup java -jar -Dlog.file.path=./logs $server > ./logs/$log &2>1 &
}
fi
done
扩展
本文的方式仅为最简单的实现,未添加邮件发送的内容。同时,按理来说需要通过kill命令将死掉的进程杀死,避免服务的重复启动失败。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。