무언가 거창한 제목이다. 하지만 별 것 아니다. 
 실무를 하다보면 급하게 서버의 트래픽을 알고 싶을 때가 있다. 서버 트래픽 분석은 잘 알려진 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;날&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;</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=http://superuser.co.kr/linux/doly/su_traffic/bar_in.gif height=9 width=$(($in_traffic/10))> $in_traffic KBit/Sec </td>"
        echo "<td><img src=http://superuser.co.kr/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 " "}'`