生活随笔
收集整理的這篇文章主要介紹了
python监控单台多实例数据库服务器的数据库端口
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? 最近公司做數(shù)據(jù)庫(kù)的單臺(tái)服務(wù)器多實(shí)例,需要對(duì)各個(gè)數(shù)據(jù)庫(kù)的進(jìn)程進(jìn)行監(jiān)控,因?yàn)槲覀兊馁Y產(chǎn)數(shù)據(jù)庫(kù)中已經(jīng)有這個(gè)服務(wù)器跑多少個(gè)實(shí)例,端口是什么,用來做什么的,所以就拿資產(chǎn)數(shù)據(jù)庫(kù)的端口和服務(wù)器本地運(yùn)行的數(shù)據(jù)庫(kù)端口進(jìn)行對(duì)比,報(bào)出沒有運(yùn)行的mysql實(shí)例以及他的用途。一種方法是根據(jù)"ps auxww|grep mysqld|grep -v root|grep -v grep"這個(gè)命令抓取本地運(yùn)行的數(shù)據(jù)庫(kù)端口,不過你也可以根據(jù)netstat命令來獲取本地?cái)?shù)據(jù)庫(kù)實(shí)例的所有端口;還有一種方法就是從資產(chǎn)中得到這個(gè)服務(wù)器應(yīng)該運(yùn)行的所有mysql端口,用python的socket模塊來檢測(cè)端口是否存活,這種方法比較簡(jiǎn)單一些。我用第一種方法是因?yàn)槲业倪@段代碼我已經(jīng)寫過用于其他用途,等于復(fù)用,圖個(gè)省事。以下是代碼內(nèi)容:
???import?os,sys,MySQLdb??def?center(sql):?????try:?????????center_ip?=?'192.168.1.100'?????????center_user?=?'root'?????????center_passwd?=?'xxxxxx'?????????conn?=?MySQLdb.connect(host?=?center_ip,user?=?center_user,passwd?=?center_passwd,charset='utf8',connect_timeout=20)?????????cursor?=?conn.cursor()??????????cursor.execute(sql)?????????alldata?=?cursor.fetchall()?????????cursor.close()?????????conn.close()?????????return?alldata?????except:?????????return?0??class?check_port():??????def?__init__(self):?????????conn?=?"ip?a|grep?glob|grep?-v?'192.168'|awk?'{print?$2}'"?????????self.host?=?os.popen(conn).readlines()[0].split("/")[0]??????def?remot(self):?????????sql?=?"SELECT?PORT?FROM?center.host_info?WHERE?flag='1'?AND?del_info!=0?AND?ip='%s'?AND?host_name?IN?('a','b','c')"?%?self.host?????????alldata?=?center(sql)?????????cent_port?=?[]?????????if?alldata?!=?0:?????????????for?i?in?alldata:?????????????????cent_port.append(str(i[0]))?????????????return?cent_port?????????else:?????????????return?cent_port??????def?local(self):?????????psinfo?=?os.popen("ps?auxww|grep?mysqld|grep?-v?root|grep?-v?grep").readlines()?????????local_port?=?[]?????????if?not?psinfo:?????????????return?local_port?????????for?i?in?psinfo:?????????????for?j?in?i.split("--"):?????????????????if?j.find("port")?!=?-1:?????????????????????port?=?j.split("=")[1].strip()?????????????????????local_port.append(port)?????????return?local_port??????def?main(self):?????????local_port?=?self.local()?????????cent_port?=?self.remot()?????????????????cent_port.sort()?????????????????local_port.sort()?????????if?local_port?==?cent_port?and?len(local_port)?!=?0?and?len(cent_port)?!=?0:?????????????print?0?????????else:?????????????error?=?""?????????????diff_list?=?list(set(local_port)?^?set(cent_port))?????????????for?port?in?diff_list:?????????????????sql?=?"SELECT?CONCAT(a.main_name,'_',b.sub_name,'_',c.app_name,'_',c.port)?AS?used?FROM?center_app.main_category?a,?center_app.sub_category?b,?center_app.app_info?c?WHERE?a.id?=?b.main_id?AND?b.dist_id?=?c.dist_id?AND?b.main_id?=?c.main_id?AND?b.main_id='2'?AND?c.flag='1'?AND?c.del_info!=0?AND?c.ip='%s'?and?c.port='%s'"?%?(self.host,port)?????????????????alldata?=?center(sql)?????????????????if?error?==?"":?????????????????????error?=?error?+?alldata[0][0]?????????????????else:?????????????????????error?=?error?+?";"?+?alldata[0][0]?????????????print?error??if?__name__?==?"__main__":?????boss?=?check_port()?????boss.main()??如果用第二種方法的話,很簡(jiǎn)單,用下面的函數(shù)可以實(shí)現(xiàn)這個(gè)端口測(cè)試:
ipmort?socket??def?test_port()?????s?=?socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2)?????address?=?'127.0.0.1'?????port?=?80?????try:?????????s.connect((address,port))?????????return?True?????except?Exception,e:? ????????return?False ???? s.close()? ??
本文轉(zhuǎn)自 lover00751CTO博客,原文鏈接:http://blog.51cto.com/wangwei007/1118809,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的python监控单台多实例数据库服务器的数据库端口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。