유저별 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)

리눅스 유저별 fd 값 산출하기

리눅스 유저별 fd 값 산출하기”에 대한 2개의 생각

  • 2019년 5월 21일 6:35 오후
    고유주소

    ps -o pid -u $1 | sort -nr` 에 $1이 뭘 의미한가요?

    응답
    • 2019년 5월 27일 3:43 오후
      고유주소

      # ./userfd.sh testuser
      --> $1은 쉘스크립트 실행 시 첫번째 인자 값에 대한 변수를 의미합니다. 즉 위와 같이 실행 시 testuser가 $1 변수에 들어 갑니다.

      응답

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다