무언가 거창한 제목이다. 하지만 별 것 아니다. 실무를 하다보면 급하게 서버의 트래픽을 알고 싶을 때가 있다. 서버 트래픽 분석은 잘 알려진 snmp 프로토콜을 이용하여 mrtg를 사용하면 멋지고 화려하게 모니터링 할 수 있지만, mrtg 설치 작업은 여간 귀찮은 것이 아니다. 만약 잠시가아닌 지속적으로 트래픽을 모니터링 하고 싶다면, 본 강좌를 읽는 것을 중단하고, mrtg 란의 강좌들을 읽기 바란다. su_traffic 프로그램은 아주 아주 간단한 쉘 프로그램이다. 물론 이 강좌를 쓰고 있는 저자가 만든 프로그램이다. 소스를 분석해서 모든걸 이해 하는 것 도 좋지만, 급한데로 사용하고 나중에 분석하는 것이 좋을 것이다. 그래서 본 강좌에서는 사용법부터 다룰 것이다.
1. 설치 일단, 본 프로그램을 다운로드한다. su_traffic.tar.gz <== 다운로드 적당한 위치에 복사한다.그리고 압축을 해제한다.. tar xvfpz su_traffic.tar.gz 이런 프로그램은 거의 root만 사용하기 때문에 다음 디렉토리에 설치할 것을 권장한다. /root/bin
2. 실행 이렇게 간단하게 설치(이건 설치란 말보단 복사가 맞겠죠^^)하고 이제 운영에 들어간다. 다음 명령어를 아무 위치에서 때려 본다.
[root@test bin]# su_traffic
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ┃
┃ 패 키 지 명 : 수퍼유저 유틸리티 Ver 0.9 ┃
┃ 프로그램 명 : 트래픽 모니터링 프로그램 V0.9(su_traffic) ┃
┃ 저 작 권 : 이 프로그램의 저작권은 수퍼유저코리아에 있습니다. ┃
┃ 이 프로그램의 사용은 허용되나 재배포는 금지합니다. ┃
┃ 제 작 자 : 에스유(더리ㅡ,.ㅡ) : doly@superuser.co.kr ┃
┃ 메인사이트 : www.superuser.co.kr ┃
┃ 주배포사이트 : ftp.superuser.co.kr ┃
┃ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
사용법 : /root/bin/su_traffic 이더넷디바이스번호 text|html [시간간격]
예) /root/bin/su_traffic eth0 text 60
위와같이 간단한 설명이 나온다. 여기서 이더넷디바이스번호는 대부분 eth0 또는 eth1 일 것이다. 출력모드는 text 또는 html 으로 설정 가능하다. 시간 간격은 초 단위로 설정해야 한다. 기본값은 60초 이다. 만약 60초로 설정하면, 60초간 조사하여, 결과를 낸다는 의미이고, 약 60초 마다 조사한다는 의미도 된다.
그럼 다음과 같이 간단하게 기본 옵션을 주어서 실행 시켜 본다.
[root@test bin]# su_traffic eth0 text 60
날짜 입력 출력
04-02-27 14:25 : 20 KBit/Sec 277 KBit/Sec
04-02-27 14:26 : 22 KBit/Sec 416 KBit/Sec
04-02-27 14:27 : 26 KBit/Sec 555 KBit/Sec
04-02-27 14:28 : 25 KBit/Sec 533 KBit/Sec
04-02-27 14:29 : 19 KBit/Sec 395 KBit/Sec
위와 같은 결과를 볼 수 있다. 시간 60 초 간격이기 때문에 60초가 지나면 한줄씩 나올것이다. 위의 트래픽을 보면, 입력 트래픽은 약 : 20KBit/Sec이고, 출력은 533KBit/Sec 이다.
이렇게 중단시키지 않으면, 1분마나 한번씩 계속 남기게 된다. 만약 하루치를 남기고 싶다면 다음과 같이 하면된다. [root@test bin]# su_traffic eth0 text 60 > /root/traffic.log &
이렇게 하면 위 출력을 /root/traffic.log파일로 하기 때문에 원하는 만큼 시간이 지난후에 파일을 관찰하면 될것이다.
웹으로 결과 보기> 시스템 관리자라면 서버에 접속하여 결과를 보면 좋겠지만, 다른 사람에게 확인시키거나 좀더 화려한 그래픽으로 보길 원한다면 다음 명령어를 내려본다.
[root@test bin]# su_traffic eth0 html 60 > /home/doly/www/traffic.html & 위 명령어와 다른게 있다면, text대신 html 이 되고, 뒤에 저장되는 디렉토리는 웹에서 접근 가능한 디렉토리가 되어야 한다. 이렇게 해 두고 난 뒤.. 시간이 지났을 때 , 결과를 관찰해 보면... 다음과 같은 화면을 얻을 수 있다.
이와 같이 운영하기 바란다. 이 프로그램을 단지 사용만 하고 싶다면 이제 더 이상 강좌를 읽을 필요가 없다. 이젠 이 프로그램이 얼마나 간단하게 작성되었는지 보여 줄 것이다.
3. 소스 분석. 핵심은 다음의 자료이다. [root@test bin]# cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo:2033310139 2236997 0 0 0 0 0 0 2033310139 2236997 0 0 0 0 0 0 eth0:262141998 1953315617 160910 0 87219 0 0 0 2630588740 4036754123 0 0 0 0 0 0 eth1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
뭔가 숫자가 많아서 뭘까 하지만 가만히 보면.. 중요한 것은 지금까지 누적된 받은 자료의 양(bytes)과, 보낸 자료의 양(bytes)을 확인 할 수 있다. 우리가 필요로 하는 자료는 위 두 개의 값일 뿐이다. 그럼 적당한 명령어로 두 자료를 뽑아내야 하고 그리고 정해진 시간을 기다린 후에 다시 그 값을 뽑아내어서 차이만큼을 계산하면 끝나는 것이다. 다음 소스코드를 보자.
#!/bin/bash
## 인자를 조사하는 것이다. 첫 번째 또는 두 번째 인자가 없으면 다음 화면을 뿌린다. if [ "$1" == "" -o "$2" == "" ] ; then echo "" echo "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" echo "┃ ┃" echo "┃ 패 키 지 명 : 수퍼유저 유틸리티 Ver 0.9 ┃" echo "┃ 프로그램 명 : 트래픽 모니터링 프로그램 V0.9(su_traffic) ┃" echo "┃ 저 작 권 : 이 프로그램의 저작권은 수퍼유저코리아에 있습니다. ┃" echo "┃ 이 프로그램의 사용은 허용되나 재배포는 금지합니다. ┃" echo "┃ 제 작 자 : 에스유(더리ㅡ,.ㅡ) : doly@superuser.co.kr ┃" echo "┃ 메인사이트 : www.superuser.co.kr ┃" echo "┃ 주배포사이트 : ftp.superuser.co.kr ┃" echo "┃ ┃" echo "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛" echo "" echo "" echo "사용법 : $0 이더넷디바이스번호 text|html [시간간격]" echo "예) $0 eth0 text 60" exit 1 fi # 시간 간격 인자인데 .. 없으면 기본갓으로 60을 설정한다. 있으면 입력한 인자값을 적용한다. if [ "$3" == "" ] ; then interval=60 else interval=$3 fi if [ "$2" == "text" ] ; then #text 모드일 때 아래와 같은 헤드(??)를 뿌린다. echo " 날짜 입력 출력" else # html 모드일 때는 html 코드를 뿌린다. 테이블 정의 하고 쬐끔의 디자인^^ echo "<table align=center cellSpacing=1 cellPadding=1 border=1 bordercolor=#FFFFFF height=25 bgcolor=#6699CC> <tr bgcolor=#FFFFFF valign=middle> <td> 날 </td> <td>입력</td> <td>출력</td> </tr>" fi # 무한루프로 돌린다. while ( true ) ; do # 지금까지 전송한 양을 구하다. in_start=`cat /proc/net/dev | grep $1 | awk -F: '{print $2}' | awk '{print $1 }'` out_start=`cat /proc/net/dev | grep $1 | awk -F: '{print $2}'| awk '{print $9 }'` # 인자로 넘겨받은 시간만큼 잔다. sleep $interval # 또 지금까지 전송한 자료의 양들을 구한다. in_end=`cat /proc/net/dev | grep $1 | awk -F: '{print $2}'| awk '{print $1 }'` out_end=`cat /proc/net/dev | grep $1 | awk -F: '{print $2}'| awk '{print $9}'` # 들어온 양을 계산한다. *8을 해준 것은 단위가 Bit이기 때문이다. 1024를 곱하는 것은 KBit 단위 때문 in_traffic=$(( ($in_end - $in_start)*8/($interval*1024) )) out_traffic=$(( ($out_end - $out_start)*8/($interval*1024) )) # 오늘 날짜 및 시간을 구한다. export today="`date '+%y-%m-%d %k:%M'`" if [ "$2" == "text" ] ; then # text 모드일 경우 아래와 같이 출력 echo $today : $in_traffic KBit/Sec $out_traffic KBit/Sec else # html 모드일 경우 아래와 같이 출력 (html 디자인을 바꾸고 싶다면 아래 부부분을 변경하면 더 이뿌게 된다. echo "<tr><td> $today </td><td><img src=/_Data/Linux_old/linux/doly/su_traffic/bar_in.gif height=9 width=$(($in_traffic/10))> $in_traffic KBit/Sec </td>" echo "<td><img src=/_Data/Linux_old/linux/doly/su_traffic/bar_out.gif height=9 width=$(($out_traffic/10))> $out_traffic KBit/Sec</td></tr>"
fi done
4. 마치며..
이렇게 간단한 쉘 프로그램으로 간단하지만 멋진 트래픽 측정 프로그램을 만들 수 있다. 긴급하게 필요하거나 짧게는 몇초 길게는 몇 달 . 트래픽을 분석 할 수 있을 것이다. 조금 변경하면 mrtg 처럼 멋지게 꾸밀 수 있지만, 너무 복잡하기 때문에 .. 프로그램 짜는 것 보다. mrtg 설치 하는 것이 더 노가다를 적게 하는 일이라 생각하기에 이쯤에서 마무리 한다. 혹시 이 프로그램에 대한 질문 및 버그를 발견하게 되면, 메일 한통 보내주기 바란다. 메일주소는 doly 골뱅이superuser.co.kr 이다. 메일 주소를 무단 수집해서 스팸메일을 보내는 이를 막기 위해서 위와 같이 표기했으며, 골뱅이 부분은 @ 치환하면 된다. 이상... 수퍼유저 운영자 doly ...
- 2004년 4월 17일 정지하는법 추가^^ 안녕하세요 정우성님께서 요청해주신 글을 바탕으로 데몬모드 실행시 정지시키는 방법을 알려 드리겠습니다. 특별한 방법은 없으며, 해당 프로세스를 찾아서 죽여주면 됩니다. 이 명령어를 한줄로 쓰면.. 다음과 같습니다. kill -9 `ps -ef | grep su_traffic | awk '{printf $2 " "}'`
|