Python 으로 서버의 Disk IO 를 측정/모니터링 해보자.

 

# ------------------------------------------------------------------------------
# Disk IO (Write Count) 모니터링
# ------------------------------------------------------------------------------

import os
import sys
import time

# pip install psutil 으로 먼저 설치
import psutil

# pip install pymssql 으로 먼저 설치 (MS-SQL을 사용하는 경우)
import pymssql


interval = 60
disk_io_over = 0
max_val = 0


def send_sms(receiver, msg):
    # 자신의 환경에 맞는 문자전송시스템에 보내도록 구현


while 1:
    disks_before = psutil.disk_io_counters()
    time.sleep(interval)
    disks_after = psutil.disk_io_counters()
    disks_write_cnt_per_sec = disks_after.write_count - disks_before.write_count
    if disks_write_cnt_per_sec > max_val :
        max_val = disks_write_cnt_per_sec

    print("Cur Val : %d, Max Val : %d" % (disks_write_cnt_per_sec, max_val))

    if disks_write_cnt_per_sec > 20000 :
        if disk_io_over == 0 :
            send_sms('받는이전화번호', 'YoonHQ Disk IO Error')
            print('Disk IO Error\n')
        disk_io_over = 1
    else :
        if disk_io_over == 1 :
            send_sms('받는이전화번호', 'YoonHQ Disk IO Normal')
            print('Disk IO Normal\n')
        disk_io_over = 0


이번에는 Python 에서 SAN 스위치 장애를 체크하는 스크립트를 만들어보았다. Perl 의 경우와 거의 같다.

Python 2.7.3 에서 테스트하였으며, pymssql 를 별도로 설치해야 한다.

# -*- coding: cp949 -*-
# ------------------------------------------------------------------------------
# (1) SAN 스위치의 Telnet에 연결하여, switchstatusshow 명령의 결과에 따라서
#     HEALTHY 가 아니면 장애로 간주하고 담당자에게 문자메시지를 보낸다.
#
# (2) 하루에 1번 작동한다.
#
# Python Version : 2.7.3
# 
# [필요한 패키지]
# easy_install pymssql
#
# Normal Status ----------------------------------------------------------------
# SwitchState:    HEALTHY
# ------------------------------------------------------------------------------
import telnetlib
import pymssql

# ------------------------------------------------------------------------------
def send_sms(msg):
    sql = """ insert arreo_sms ( CMP_MSG_ID, 
        CMP_USR_ID, 
        WRT_DTTM, 
        RCV_PHN_ID, 
        CALLBACK, 
        SND_DTTM, 
        SND_MSG , 
        SND_PHN_ID, 
        RSRVD_ID ) 
        values ('011' + CONVERT(varchar, GETDATE(), 12) + REPLACE(CONVERT(varchar, GETDATE(), 14), ':', '') + SUBSTRING(CONVERT(VARCHAR, RAND(), 109), 3, 2), 
        '00000', 
        CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 8), ':', ''), 
        '%s',
        '01055555555',
        CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 8), ':', ''), 
        '%s', 
        'ADMIN', 
        'ADMIN' ) """ % ("메시지받을사람의전화번호", msg)
    conn = pymssql.connect(host='서버주소', user='아이디', password='비밀번호', database='DB이름')
    cur = conn.cursor()
    cur.execute(sql)
    conn.commit()
    conn.close()

# ------------------------------------------------------------------------------

devices = { "SAN_SW1" : "172.16.0.21",
            "SAN_SW2" : "172.16.0.22",
            "SAN_SW3" : "172.16.0.23",
            "SAN_SW4" : "172.16.0.24" }

for device_key in devices.keys() :
    tn = telnetlib.Telnet(devices[device_key])
    tn.read_until("login: ")
    tn.write("아이디\n")
    tn.read_until("Password: ")
    tn.write("비밀번호\n")
    tn.write("\n")
    tn.write("switchstatusshow\n")
    tn.write("exit\n")
    result = tn.read_all()
    for line in result.splitlines() :
        if "SwitchState:" in line :
            if "HEALTHY" in line :
                msg = device_key + " : Normal"
                print(msg)
                send_sms(msg)
            else :
                msg = device_key + " : Error"
                print(msg)
                send_sms(msg)


ImageMagick 을 이용하여 이미지 파일들을 일괄로 Crop 하는 스크립트이다. ImageMagick 모듈을 이용하지 않고, convert 툴을 이용하여 구현하였다. 이번엔 급한대로 써야 해서 대충했지만, 다음에는 관련 모듈을 이용해서 제대로 해봐야겠다.

  • 관련 모듈
    • Wand is a ctypes-based ImagedMagick binding library for Python.
    • PythonMagickWand is an object-oriented Python interface to MagickWand based on ctypes.
    • PythonMagick is an object-oriented Python interface to ImageMagick.

import os, glob, shutil
 
# 원하는 사이즈와 출력 디렉토리를 정한다.
CROP_SIZE = '1739x2617+364+0'
OUT_DIR   = 'output'
 
if os.access(OUT_DIR, os.F_OK) :
    shutil.rmtree(OUT_DIR)
os.mkdir(OUT_DIR)
file_list = glob.glob('*.tif') # 이미지 확장명을 정한다.
 
cnt = 1
for filename in file_list :
    print('%s/%s : convert %s -crop "%s" %s\\new_%s' % (cnt, len(file_list), filename, CROP_SIZE, OUT_DIR, filename))
    os.system('convert '+filename+' -crop "'+CROP_SIZE+'" '+OUT_DIR+'\\new_'+filename)
    cnt = cnt + 1

보통 pysqlite 를 설치하려면, pip install pysqlite 명령을 이용해서 쉽게 할 수 있다. 그러나, FreeBSD 9.0 에 pythonbrew를 이용해서 직접 python 을 설치한 경우에는 sqlite3 의 include, library 경로의 문제로 바로 되지 않는다. 이 때문에 직접 소스를 받아서, 올바른 경로를 설정하고 설치해주어야 한다. 

설치 순서는 아래와 같다.
$ pkg_add -r sqlite3
$ wget http://pysqlite.googlecode.com/files/pysqlite-2.6.3.tar.gz
$ tar xvfz pysqlite-2.6.3.tar.gz
$ cd pysqlite-2.6.3
$ vi setup.cfg
include_dirs=/usr/local/include
library_dirs=/usr/local/lib
$ python setup.py install


+ Recent posts