python筆記

1. nagios被動監控傳遞狀態碼

#!/usr/bin/python
import sys,time,os
DATE=time.strftime("%Y-%m-%d",time.localtime())
FILE='/home/OffLineRanking/'+'topqueryNormalize.log'+DATE
SUM=int(os.popen('cat %s |grep ERROR |wc  -l' %FILE).read())
if  SUM>=100:
        print "error log is %s" % SUM
        sys.exit(2)
else:
        print"ok"
        sys.exit(0)

知識點:
1.time.strftime()格式化輸出時間格式,time.localtime()獲取本地時間,還有一個time.time()獲取秒級別,例如:DATE=time.strftime("%Y-%m-%d",time.localtime(time.time()))
2.sys.exit(),返回命令執行結果的狀態碼,相當於shell中的exit ,這樣可以根據echo $? 的值進行後期的判斷處理
3.python操作命令並獲取返回值。有很多模塊可以完成這個功能,我這裏使用的os.popen(),注意一下int()以及os.popen()內部FILE變量的傳遞
4.字符串的拼加

2.python操作ssh
這個命題使用shell也可以完成很多功能,使用py完全是爲了學習它操作ssh的方式。
一般py操作ssh有兩種密碼認證方式,明文的用戶名和密碼以及ssh-key的形式,我這裏使用明文進行操作,儘管我們線上ssh通道是完全打通的:
#!/usr/bin/python
####just a test script####
import paramiko,sys
x=raw_input("input the log data:")
if x.isdigit()==True:
        for i in [xx1.alibaba.com','xx2.alibaba.com','xx3..alibaba.com','xx4.alibaba.com']:
                file='access_log_'+x
                ssh=paramiko.SSHClient()
                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                ssh.connect(i,username='test',password='1234')
                stdin, stdout, stderr = ssh.exec_command('cd /home/logs/nginx/;cat %s |grep error |wc -l ' %file)
                for j in stdout.readlines():
                        print j,
 知識點:
1.還是注意file的傳遞方式,這個方法並不通用
2.print j後面的逗號
 

3.操作http
回頭寫吧,我先看完14章

4.監控系統進程腳本
#!/usr/bin/python
import os,sys
def checkserver(svr,msg):
        num_cmd="ps -eo comm |grep %s -c"%svr
        SERVER_NUM=int(os.popen(num_cmd).read())
        pid_cmd="ps -ef |grep %s |grep -v grep |awk '{print $2}'"%svr
        strf_pid=os.popen(pid_cmd).read()
        format_pid=strf_pid.replace('\n',' ').split(' ')[:-2]
        for i in format_pid:
                PATH='/proc/'+i+"/status"
                STATS=os.popen('grep [Zz]ombie %s'%PATH).read().lower()
                if "zombie" not in STATS and SERVER_NUM==21:
                        stdout="%s is ok!"%msg
                        exit_code=0
                        continue
                else:
                        print "%s is error!"%msg
                        sys.exit(2)
        print stdout
        sys.exit(exit_code)
if __name__ == '__main__':
        if len(sys.argv)<1:
                print "input error!"
                sys.exit(-1)
        else:
                checkserver(sys.argv[1],sys.argv[2])

5.系統進程數監控
#!/usr/bin/env python
import os,sys
try:
        cmd=int(os.popen('ps -eo comm |grep %s -c'%sys.argv[1]).read().strip("\n"))
        if cmd!=int(sys.argv[2]):
                print "%s num is abnormal"%sys.argv[1]
                sys.exit(2)
        else:
                print "%s num is correct"%sys.argv[1]
                sys.exit(0)
except (IndexError,ValueError,SyntaxError):
        print "useage:%s servername servernumber"%sys.argv[0]
        sys.exit(2)

6.監控core file
#!/usr/bin/env python
import sys,os
try:
        m=[i for i in os.listdir(sys.argv[1]) if "core." in i]
        if m:
                print "%s core now!"%sys.argv[2]
                sys.exit(2)
        else:
                print "%s status ok!"%sys.argv[2]
                sys.exit(0)
except (IndexError,ValueError,SyntaxError,OSError):
        print "useage:%s corepath servername"%sys.argv[0]
        sys.exit(2)

7.監控tair空間
#!/usr/bin/env python
#coding: UTF-8
import sys,os,socket
def formatdata(k):
        hostname=socket.getfqdn(k.split(" ")[0])
        data=k.split(" ")[1].strip()
        return hostname,data
def tairspace(cmd):
        m=os.popen(cmd).readlines()
        if not m:
                print "tair usespace is ok!"
                sys.exit(0)
        elif len(m)==1:
                j=formatdata(m[0])
                print "%s tairspace is %s%%"%(j[0],(int(j[1])/(monitor_size/100)))
                sys.exit(2)
        else:
                k=open('/home/a/logs/spaceerror','w')
                for i in m:
                        j=formatdata(i)
                        k.writelines("%s %s %s%%\n"%(j[0],j[1],(int(j[1])/(monitor_size/100))))
                k.close()
                print "%s nods tairspace exceed 80%%,check log for detail!"%len(m)
                sys.exit(2)
if __name__=='__main__':
        try:
                if len(sys.argv)>3:
                        print "use %s cs_ip:port group_name"%sys.argv[0]                                                                          
                        sys.exit(2)
                else:
                        slab_mem=int(os.popen('grep slab_mem `rpm -ql tair |grep dataserver`').read().split("=")[1])
                        monitor_size=slab_mem*1024*1024
                        cmd='/opt/csr/tair-2.3/sbin/tairclient -c %s -g %s  -l stat 2>&1|grep 172|grep use |awk -F "[: ]" \'{a[$1]+=$7}END{for(i in a){if(a[i]>%s){print  i\" \"a[i]}}}\''%(sys.argv[1],sys.argv[2],monitor_size*0.8)
                        tairspace(cmd)
        except IndexError:
                print "use %s cs_ip:port group_name"%sys.argv[0]
                sys.exit(2)

8.python表示時間日期
昨天.今天.明天
from datetime import *
today=date.today()
yesterday=date.today()-timedelta(days=1)
tommorrow = date.today()+timedelta(days=1)
如下輸出20120101的格式:
print (date.today()-timedelta(days=1)).strftime('%Y%m%d')
9.監控tt2
#!/usr/bin/python
import sys,os,time
def checktt2(path):
    cu_date=time.strftime("%Y%m%d%H",time.localtime())
    if os.path.isdir('%s'%path):
        rpath=os.getcwd()
        files=os.listdir(rpath)
        for i in files:
#            if "tmp" not in i:
            if "taobao_ie_" in i:
                z=open(i,'r').readlines()
                r=z[0].strip('\n')
                k=int(z[-1].strip('\n'))
                y=os.path.getsize(r)
                if y-k<52428800:
                    print "tt2 status is ok!"
                    sys.exit(0)
                else:
                    print "tt2 status is error!"
                    sys.exit(2)
    else:
        print "tt2 path is not exist!"
        sys.exit(2)
if  __name__=='__main__':
    path='/home/server/tt2'
    checktt2(path)
10.socket 簡單通信
server:
if __name__ == '__main__':
        import socket,sys
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('111.4.23.23', 8001))
        sock.listen(6)
        i=5
        all=[]
        while True:
                try:
                        connection,address = sock.accept()
                        connection.settimeout(5)
                        buf = connection.recv(1024)
                        if buf !="":
                                all.append(buf.split(","))
                        else:
                                connection.send('please go out!')
                                sys.exit(2)
                except Exception,e:
                        print str(e)
                        connection.close()
                i=i-1
                if i ==0:
                        print sorted(dict(all).items(),key=lambda d:int(d[0]))
                        break
client:
#!/usr/bin/python
import time,socket,os,sys
def sum(path):
        if os.path.isdir(path):
                os.chdir(path)
                curr_date=time.strftime('%Y%m%d%H',time.localtime())
                file=path+curr_date
                if os.path.isfile(file):
                        lines=os.popen('wc -l %s'%file).read()
                        lines_format=lines.strip("\n").split(" ")[0]
                        return lines_format
                else:
                        print "file is not exist!"
                        sys.exit(2)
        else:
                print "path is not exist!"
                sys.exit(2)
def content(lines_format):
        hostname=socket.gethostname()
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        sock.connect(('119.42.236.236',8001)) 
        time.sleep(2)
        #lines=lines_format+","+"\'%s\'"%hostname
        lines=lines_format+","+hostname
        sock.send('%s'%lines)
        print sock.recv(1024) 
        sock.close()
if __name__=='__main__':
        path="/home/guizhong/"
        date=sum(path)
        content(date)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章