應用背景:
zabbix監控系統介紹及安裝,參考大牛運維生存時間,這兒就不啰嗦了,
為了zabbix-agent端能自動把服務器端的服務端口匯報給 zabbix server端,監控其端口是否存活可用,
用下面的腳本:service_scan.py 部署於agent端 /usr/local/zabbix-agent/bin/service_scan.py
部署准備:
- service_scan.py腳本 依懶 python2.7版本下的 psutil庫,
- 需要在agent端安裝 python2.7版本,
- 用python2.7 安裝相關的 psutil庫
/usr/local/python27/bin/pip install psutil
服務器端口自動發現腳本: service_scan.py
#!/usr/local/python27/bin/python # author: moorewqk@163.com # import os, sys, time import commands import psutil import socket import json del_list = ["rpc.statd","java"] def Handle_Connects(): rows = [] lc = psutil.net_connections('inet') for c in lc: (ip, port) = c.laddr if ip == '0.0.0.0' or ip == '::': if c.type == socket.SOCK_STREAM and c.status == psutil.CONN_LISTEN: proto_s = 'tcp' #elif c.type == socket.SOCK_DGRAM: # proto_s = 'udp' else: continue pid_s = str(c.pid) if c.pid else '(unknown)' #print pid_s,port rows.append('%s:%s'%(pid_s,port)) dedup_list = {}.fromkeys(rows).keys() return dedup_list def handler_pid(pid,port): service_dict = {} p = psutil.Process(int(pid)) if p.as_dict()['name'] == 'jsvc': service_pname = p.as_dict()['environ']['HOME'].split('/')[3] service_dict['{#PNAME}'] = service_pname service_dict['{#PPORT}'] = port else: service_pname = p.as_dict()['name'] service_dict['{#PNAME}'] = service_pname service_dict['{#PPORT}'] = port return service_dict def main(): zb_dict = {} service_list = [] result_list = [] clist = [] for i in Handle_Connects(): pid = i.split(':')[0] port = i.split(':')[1] service_list.append(handler_pid(pid,port)) for dictlist in service_list: if dictlist["{#PNAME}"] in del_list: result_list.append(dictlist) #service_list.remove(dictlist) #print result_list for delname in service_list: if delname not in result_list: clist.append(delname) zb_dict['data'] = clist print json.dumps(zb_dict,sort_keys=True,indent=4) if __name__ == "__main__": main()