公司服务器多,坏的也多,经常会有硬盘只读的,因为服务器太多,有的坏了很久也发现不了,因此写个程序,扫描只读的硬盘,因为这个不是发现故障就必须紧急处理的,所以只是定时执行一遍,扫描入库即可,这个程序可以用来做多种批量操作,只需要改一下执行的命令即可,非常好用

程序代码:

#!/usr/local/bin/python2.7#-*- coding: utf-8 -*-import paramikoimport sysreload(sys)sys.setdefaultencoding('utf8')   import osimport MySQLdbimport timeimport datetimeimport getoptimport jsonimport collectionsimport refrom multiprocessing import Pooluser='root'PORT='******'H3303='*****com.cn'H3304m='*****com.cn'P3303=3303P3304=3304dp_admin='dp_admin'HOST_PORT='3303'HOST_USER = 'mysqlha'HOST_PASSED = '*******'db='test'ctime_min = (int(time.strftime('%M',time.localtime(time.time())))/5*5)ctime=time.strftime('%Y-%m-%d %H:',time.localtime(time.time()))ctime=ctime + str(ctime_min) + ':00'print ctimedef sql_select(sql, port=3304, domain='*****.com.cn', db='swordfish'):    port = int(port)    array = []    try:        db = MySQLdb.connect(host=domain,user=HOST_USER,port=port,passwd=HOST_PASSED,db=db,connect_timeout=3,charset="utf8")        cursor = db.cursor()        cursor.execute(sql)        rows = cursor.fetchall()        for row in rows:            array.append(row)        return array    except Exception,e:        print str(e)        return arraydef sql_insert(sql, port=3304, domain='******com.cn', db='swordfish'):    try:        db = MySQLdb.connect(host=domain,user=HOST_USER,port=port,passwd=HOST_PASSED,db=db,connect_timeout=3,charset="utf8")        cursor = db.cursor()        cursor.execute(sql)        db.commit()        db.close()    except Exception,e:        print str(e)        db.rollback()        db.close()def get_all_ip():    sql_all = """              select distinct ip_in from node \              where depid=1 \              and ip_in not in \              (select node.ip_in from node, node2module where node.id=node2module.nid \              and node2module.mname  in ('dbstorage') )                """    return sql_select(sql_all, port=3303, domain='*****.com.cn', db='dp_admin')def remote_cmd(host):    begintime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))    begintime = time.strptime(begintime, '%Y-%m-%d %H:%M:%S')    begintime = datetime.datetime(*begintime[:6])    #print 'process host %s'%(host)    #标志位,表示是否ssh ok    flag=0    host_info=[host,flag]    try:    cmd1=''' for i in `df -l | egrep -v 'Mounted|shm' | awk '{print $6}'`;  do  cd  $i;  [[ -d $i ]] && (cd $i; touch 'read_only_test_file' 2>/dev/null; [[ $? -ne 0 ]] && echo $i | tr '\n' ',' || (rm -fr read_only_test_file)) ; done  '''        cmds=[cmd1]     for cmd in cmds:            paramiko.util.log_to_file('paramiko.log')            s = paramiko.SSHClient()            s.set_missing_host_key_policy(paramiko.AutoAddPolicy())            s.connect(hostname=host,username=user,port=int(PORT),timeout=5)            s0,s1,s2 = s.exec_command(cmd,timeout=20)            info = s1.read().strip()            host_info.append(info)        s.close()    except Exception,e:        #根据第二个标志位确定ssh是否通        host_info[1]=-1    if host_info[1] == -1:        #bad_ssh="%s\n" % (host_info[0])        #print 'bad ssh 1 %s' % (host_info[0])         return []     else:        ##部分机器出现这种错误:Unable to get valid context for root,目前只能通过匹配字符串排除异常        if host_info[2].find("Unable to get valid context for root")==0:            #bad_ssh = "%s\n"%(host_info[0])            #print 'bad ssh 2 %s' % (host_info[0])             return []        else:            if host_info[2]:                return [host_info[0], host_info[2]]            else:                #执行结果为空的                return [host,]if __name__=='__main__':    begintime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))    begintime = time.strptime(begintime, '%Y-%m-%d %H:%M:%S')    begintime = datetime.datetime(*begintime[:6])    hosts = get_all_ip()    host_list = []    for host in hosts:        host_list.append(host[0])    pool = Pool(8)    data = pool.map(remote_cmd, host_list)    pool.close()    pool.join()         for d in data:        if d:             if len(d) == 2:                ip = d[0]                raid_mon_info = d[1]                raid_mon_value = 'BAD'                raid_mon_info = ip + '#NULL#NULL#NULL#NULL#' + raid_mon_info            else:                ip = d[0]                raid_mon_value = 'OK'                raid_mon_info = ip + '#NULL#NULL#NULL#NULL#' + 'OK'        sql = "insert into disk_readonly (ip_in, disk_readonly_value, disk_readonly_info, ctime) values ('%s', '%s', '%s', '%s')" % (ip, raid_mon_value, raid_mon_info, ctime)        #print sql        sql_insert(sql)                            endtime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))    endtime = time.strptime(endtime, '%Y-%m-%d %H:%M:%S')    endtime = datetime.datetime(*endtime[:6])    time_dvalue =  (endtime - begintime).seconds    print '总执行时间:%s sec' % (time_dvalue)    print '统计的机器数 %s' % (len(hosts))