안녕하세요. 따시입니다.

 

프로세스의 File Descriptor 개수 확인하는 shell script를 공유하려고 합니다.

 

FD(File Descriptor ) 는 파이프, FIFO, 소켓, 터미널, 디바이스, 일반파일 등 종류에 상관없이 모든 열려있는 파일을 참조할때 씁니다.

운영체제에서 FD 자원을 무한정 쓸수는 없습니다. (file descriptor65535까지 최대로 사용이 가능)

 

만약 어플리케이션에서 소켓 통신 또는 파일 I/O 등을 사용할때에 FD 를 사용 후 반환을 안한다면

어플리케이션을 죽게 됩니다.

 

과거 개발할때에 파일로그를 직접 쓰는 기능이 있었는데 Close를 안하고 적용한적이 있었습니다.

로그를 쓸때에 파일을 Open하면서  FD를 사용했지만 Close를 안해서 FD를 반환을 안한것..

결국 FD는 끝없이 올라 갔고, 어플리케이션을 장애가 나고 말았습니다.

 

요즘은 웹어플리케이션 모니터링을 해주는 APM 가 잘 만들어져 있긴합니다.

그러나... 개발중이나.. 급하기 디버깅을 하여 운영체제에서 수치 확인이 필요할 때에 도움이 되었으면 합니다.

 

#!/bin/sh
init_var ()
{
    REFRESH_TIME=5
    RUN_START=`tput setaf 2`
    RUN_END=`tput sgr0`
	REVC=`tput smso`
    NORC=`tput rmso`
	PROCESSES="tomcat-api
"
}

init_scr ()
{
    echo "${REVC}"
    echo "_________________________________________________"
    echo "           PROCESS MONITOR START             "
    echo "_________________________________________________"
    echo "${NORC}"
}

end_scr ()
{

    echo "${REVC}"
    echo "_________________________________________________"
    echo "           PROCESS MONITOR...                "
    echo "_________________________________________________"
    echo "${NORC}"
}

intr_rtn ()
{

    echo ""
    echo "${REVC}"
    echo "_________________________________________________"
    echo "           PROCESS MONITOR END               "
    echo "_________________________________________________"
    echo "${NORC}"
    exit 1
}

#---------------------------------------
init_var

trap intr_rtn 2  > /dev/null 2> /dev/null  # Interrupt Key
trap intr_rtn 3  > /dev/null 2> /dev/null  # Quit Key
while true; do
    clear
    init_scr

	for PROCESS in ${PROCESSES}; do
		PID=`ps -ef  | grep ${PROCESS} | grep -v grep | grep -v "tail -f" | grep -v "vi " | grep -v "tcpdump" | awk '{print $2}'`
        if [ "${PID}" != "" ]; then
            echo "$PROCESS[$PID] FD = `ls -al /proc/${PID}/fd | wc -l`"
        else
            echo "$PROCESS[$PID] FD = 0"
        fi
	done

    end_scr
    sleep ${REFRESH_TIME};
done


 

리눅스에서 위 shell script를 작성하여 실행하면 아래와 같이 출력이 됩니다.

 

tomcat-api 값은 shell script 에 작성한 프로세스 명이고

[3383]은 pid 값입니다.

87은 현재 사용하고 있는 FD Count 값입니다.

 

5초간격으로 새로고침이 되며, FD 값이 유지되는지.. 끝없이 올라가는지.. 확인을 하 실수 있습니다.

 

 

 


 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기