有一个模块最近总是假死,假死的现象就是进程还在但是端口(9030端口)已经不工作了。于是就需要写一个端口探测脚本,发现该端口一旦无法正常收到信息,就重启此模块。
由于此模块是一个五台机器的集群,我这次没有在五台机器都跑一样的脚本,而是在一个可以免密码ssh到他们的机器上写了一个脚本,让这个机器去探测对应的端口。模式如图:
先创建一个detect.conf
如下,他的格式是yaml,所以不要用tab用空格:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20---
Name: localhost
IP: 127.0.0.1
Port: 9030
---
Name: mrs-05
IP: 10.0.1.14
Port: 9030
---
Name: mrs-04
IP: 10.0.1.13
Port: 9030
---
Name: mrs-03
IP: 10.0.1.12
Port: 9030
---
Name: mrs-02
IP: 10.0.1.11
Port: 9030
脚本detect.py
内容如下:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50# !/usr/bin/env python
# -*- coding:utf-8 -*-
# 作者:ChrisChan
# 用途:Python3.6脚本,检测IP端口连接是否正常,建议放在单独的机器里进行端口扫描,此脚本需要搭配同目录下的detect.conf使用。
# 请先pip install PyYaml,pip install paramiko
import socket
import paramiko
import yaml
# ssh秘钥地址
key_filename = "秘钥地址,即id_rsa"
# 重启进程命令
command = "具体的进程启动命令"
def is_open(ip, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, int(port)))
s.shutdown(2)
return True
except:
return False
def ssh(ip):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(ip, 22, "appuser", key_filename=key_filename) #这里写死了22端口和appuser用户
except FileNotFoundError as e:
print('私钥文件不存在!')
except AuthenticationException as e:
print('私钥不正确,请检查对应用户或私钥内容!')
else:
stdin, stdout, stderr = ssh.exec_command(command)
print(stdout.readlines())
finally:
ssh.close()
if __name__ == '__main__':
input = open('detect.conf', 'r') # 这里是pyyaml 5.1的新格式
ys = yaml.load_all(input, Loader=yaml.FullLoader)
for y in ys:
host = y["IP"] #从yaml里取值
port = y["Port"]
if is_open(host, port):
print(y["Name"] + " is OK")
else:
print(y["Name"] + " is NO")
ssh(host)
print("Process is started!")
内网探测效果还不错,如果时间耗时比较长,就放弃for循环,走多进程路线更佳!