3. OS이야기/03. Shell Script

[UNIX/LINUX] 1분 단위 netstat 상태값 로깅 스크립트

알 수 없는 사용자 2014. 8. 1. 16:13

#!/bin/bash


outDir=/home/NETSTAT


if [ ! -d ${outDir} ]; then       // outDir 변수로 지정한 디렉토리가 존재하지 않을 경우, 디렉토리를 생성한다.

mkdir -p ${outDir}

fi


idx=1


outFile=${outDir}/netstat_`hostname`_`date +%y%m%d`.log


if [ ! -f ${outFile} ]; then       // outFile 변수로 지정한 파일이 존재하지 않을 경우, 컬럼명을 탭 간격을 주고 outFile 에 프린팅한다.

printf "CLOSED\\tCLOSING\\tCLOSE_WAIT\\tESTABLISHED\\tFIN_WAIT1\\tFIN_WAIT2\\tLAST_ACK\\tLISTEN\\tSYN_SENT\\tSYN_RECEIVED\\tTIME_WAIT\\n" > ${outFile}

fi


while [ 1 ]; do


CLOSED=0

CLOSING=0

CLOSE_WAIT=0

ESTABLISHED=0

FIN_WAIT1=0

FIN_WAIT2=0

LAST_ACK=0

LISTEN=0

SYN_SENT=0

SYN_RECEIVED=0

TIME_WAIT=0           // netstat 상태값들을 기본 0 으로 모두 초기화

netState=`netstat -na | grep tcp | awk '{print $6}' | sort | uniq -c`    // 이 명령에 의해 뿌려지는 값들을 


* netstat 명령 수행 결과 예시

# netstat -na | grep tcp | awk '{print $6}' | sort | uniq -c

      1 CLOSE_WAIT

     31 CLOSING

    234 ESTABLISHED

     15 FIN_WAIT1

     59 FIN_WAIT2

     21 LAST_ACK

     10 LISTEN

     33 SYN_RECV

   1109 TIME_WAIT

--> 첫 번째 열은 명령 수행 시점의 netstat 상태값의 개수, 두 번째 열은 netstat 상태값


for tmp in ${netState} ; do        // 하나씩 tmp 변수에 담아

remNum=`expr ${idx} % 2`      // idx 변수값을 2로 나눈 나머지(remNum)가

if [ ${remNum} -ne 0 ]; then      // 0 이 아니면(for문이 홀수번째로 수행된 거라면.. 즉, netstat 상태값의 개수가 tmp 변수에 넘어온 거라면)

sockNum=${tmp}              // netstat 상태값의 개수를 sockNum 변수에 담고

else          // 그렇지 않으면(for문이 짝수번째로 수행된 거라면.. 즉, netstat 상태값이 tmp 변수에 넘어온 거라면)

state=${tmp}                   // netstat 상태값을 state 변수에 담고

case ${state} in               // state 변수의 값에 따라 앞서 홀수번째에 세팅되었던 sockNum 값을 각 상태값에 맞게 할당

"CLOSED")

CLOSED=${sockNum}

;;

"CLOSING")

CLOSING=${sockNum}

;;

"CLOSE_WAIT")

CLOSE_WAIT=${sockNum}

;;

"ESTABLISHED")

ESTABLISHED=${sockNum}

;;

"FIN_WAIT1")

FIN_WAIT1=${sockNum}

;;

"FIN_WAIT2")

FIN_WAIT2=${sockNum}

;;

"LAST_ACK")

LAST_ACK=${sockNum}

;;

"LISTEN")

LISTEN=${sockNum}

;;

"SYN_SENT")

SYN_SENT=${sockNum}

;;

"SYN_RECEIVED")

SYN_RECEIVED=${sockNum}

;;

"TIME_WAIT")

TIME_WAIT=${sockNum}

;;

esac

fi

idx=$((idx+1))

done


printf "${CLOSED}\\t${CLOSING}\\t${CLOSE_WAIT}\\t\\t${ESTABLISHED}\\t\\t${FIN_WAIT1}\\t\\t${FIN_WAIT2}\\t\\t${LAST_ACK}\\t\\t${LISTEN}\\t${SYN_SENT}\\t\\t${SYN_RECEIVED}\\t\\t${TIME_WAIT}\\n" >> ${outFile}         // while 문의 결과에 따라 할당된 변수들을 outFile 에 프린트


sleep 10

done


위와 같이 Shell Script 를 작성한 후, crontab에 아래와 같이 설정합니다.

# crontab -l

* * * * * /home/mon_netstat.sh >& /dev/null


감사합니다.