반응형

유저별 open된 fd(file descriptor)의 정확한 값은 lsof로 확인하기는 어렵다.
각 프로세스들이 공유라이브러리 등을 공유해서 사용하는 등의 이유로 lsof에 중복되서 표기되는 요소들이 많기 때문이다.
즉, 실제 fd 보다 높게 표기되는 경향이 있다.
따라서 /proc 파일시스템의 각각의 process number(특정 유저 소유의) 아래의 fd 디렉토리 내의 것들의 합해야 특정 유저의 정확한 fd 값을 산출할 수 있다.

예를 들어 testuser 유저의 프로세스 중 프로세스 넘버가 12354가 있다면 아래와 같이 값을 구해야 한다.
# ls /proc/12354/fd/ | wc -l
11

따라서 여러개의 프로세스를 실행하고 있는 유저의 모든 fd 값을 합산하기 위해서는 스크립트의 도움이 필요하다.

아래는 특정 유저의 fd (file discripter) 현황을 출력해주는 스크립트다.

 

스크립트 내용

# cat userfd.sh

 

#!/bin/bash

NUM=0
for pid in `ps -o pid -u $1 | sort -nr`
do
    COUNT=$(ls /proc/$pid/fd/ 2>/dev/null | wc -l)
    echo "$COUNT for PID: $pid"
    NUM=`expr $NUM + $COUNT`
    if [ "$pid" = "PID" ]; then
        echo -e "$NUM \033[1;32mis total\e[21\033[0m"
    fi
done | sort -n

if [ "$1" = "" ]; then
   echo ""
   echo -e "\033[1;31m>> USERNAME is required <<\e[21\033[0m"
   echo "# $0 USERNAME"
fi

exit 0


– 스크립트 실행 인자로 받은 특정 유저의 pid를 모두 구해서 for loop 문에 값을 넣어 각각 출력 후 최종적으로 합한 값을 출력함.

 

사용 방법

– 스크립트 실행 시 인자값으로 username(testuser에서 원하는 명으로 변경)을 넣어주면 됨.
# ./userfd.sh testuser
0 for PID: PID
4 for PID: 12355
4 for PID: 6469
11 for PID: 12354
11 for PID: 6468
30 is total (testuser)

 

– total 값만 확인 시 사용법
# ./userfd.sh testuser | tail -1
30 is total (testuser)

 

[출처]https://mapoo.net/os/oslinux/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9C%A0%EC%A0%80%EB%B3%84-fd-%EA%B0%92-%EC%82%B0%EC%B6%9C%ED%95%98%EA%B8%B0/

728x90

+ Recent posts