linux下自动监控并重启某个服务

linux下莫名其妙的某个服务就挂了,又不能马上找打原因,又不能让它一直挂。
可以尝试一些小而强悍的脚本,做临时的处理。

莫名其妙的某个docker容器就挂了,怎么办呢?
思路:

  1. 检测服务的状态,netstat或者ss命令可以获取服务的端口是否被占用,如果端口被占用则说明服务正常运行着,反之则挂了。也可以使用”docker ps |wc -l”来检测docker容器的数量(容器数量较小的时候可以使用,如果比较多需要加一些判断,确定具体是某个容器挂了)。
  2. 如果检测不到相对应的端口,就启动该服。因为本文的环境是docker的某个容器挂了。需要在docker启动的时候加上一条语句: docker update –restart=always <容器id>。让容器随着docker.service启动而启动。
  3. 输出日志,如果重启过一次,就输出日志。我们可以通过一些重启的日志来反向推到服务是在某种情况下挂掉的,从而判断问题可能出现的原因。最后进行解决或者规避。

抛砖引玉的小脚本,欢迎改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# 加载环境变量

# 获取docker监听的端口的数量
port_num=`netstat -ntlp | grep -cE ":8080|:2222"`
#docker_container_num= `docker ps |wc -l`

echo $port_num

# port_num 的数量为0,则说明服务挂了。

if [ "$port_num" = "0" ]; then
# 则重新启动docker进程
/usr/bin/systemctl restart docker

# 将日志写入日志文件
echo $(date "+%F %H:%M:%S") - already restart port - process not found >> /alidata/logs/monitor/monitor_docker.log

# 如果 80 或 8080 端口有进程在监听
else
echo $(date "+%F %H:%M:%S") - I Am Ok >> /alidata/logs/monitor/monitor_docker.log
# 获取docker容器数量

# 如果返回的字符串不是 1
#if [ "$docker_container_num" = "1" ]; then
# 则重新启动docker进程
# /usr/bin/systemctl restart docker

# 将日志写入日志文件
# echo $(date "+%F %H:%M:%S") - already restart port - process not found >> /alidata/logs/monitor/monitor_docker.log
#fi
fi
---------------- 谢谢光临 ----------------
0%