多进程扫描服务器

在电信十所服务器机房里管理众多的服务器,由于个别服务器(华为服务器)纽扣电池有问题,开机启动不正常,
于是写出以下Python程序用于扫描服务器是否正常开机。

预备知识

需要扫描多个服务器的IP地址。并且只能使用Windows自带Ping.exe程序。
于是用到以下Python模块:multiprocessing、subprocess、re
这三个模块分别是多进程模块,子进程模块,正则表达式模块

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
#!/usr/bin/python 2.7
# -*- coding: utf-8 -*-
import subprocess
import re
from time import ctime
import multiprocessing


def ping_server(ip):
p = subprocess.Popen(["PING.EXE", ip], stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
out = p.stdout.read().decode('gbk')
if re.search("TTL=64", out) is not None:
print '%s' % ip, 'OK'
else:
print '%s' % ip, 'Failed!!!'


def main():
print 'Start at ', ctime()
process_list = []
args_ip = ['192.168.0.1', '192.168.80.3', '192.168.80.4', '192.168.80.100',
'192.168.1.60', '192.168.30.61', '192.168.30.62',
'192.168.30.63', '192.168.30.64', '192.168.30.82',
'192.168.30.81', '192.168.80.2']
for i in range(0, len(args_ip)):
p = multiprocessing.Process(target=ping_server, args=(args_ip[i],))
process_list.append(p)

for i in range(0, len(args_ip)):
process_list[i].start()

for i in range(0, len(args_ip)):
process_list[i].join()

print 'End at', ctime()


if __name__ == '__main__':
main()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Start at  Sun Aug 29 21:02:13 2016
192.168.0.1 OK
192.168.80.3 OK
192.168.80.4 OK
192.168.1.60 OK
192.168.80.100 OK
192.168.30.62 OK
192.168.80.2 Failed!!!
192.168.30.64 OK
192.168.30.63 OK
192.168.30.82 OK
192.168.30.61 OK
192.168.30.81 Failed!!!
End at Sun Aug 29 21:02:33 2016

结论与改进

从结果可以看出某些服务器开机不正常,进而可以做进一步措施。本次扫描只是我们小组的服务器,其他小组还没去管理。
如果服务器数量很多,有时候由于异步,打印会比较乱,这时候需要用到信号量中的经典问题生产者与消费者问题来同步进程。
下一次改进待到合适再进行。

版权声明:本文为博主原创文章,转载时注明,谢谢。