최대 파일 설명자

최대 파일 설명자

내 Linux 시스템에서 사용 가능한 모든 파일 설명자를 사용하는 스크립트를 작성하고 싶습니다. 이 작업을 수행하는 방법을 정확히 모르겠습니다. 아니면 가능할까요? 하지만 저는 "chaos Monkey" 유형의 실험을 위해 Linux 가상 머신에서 이 스크립트를 사용하고 싶습니다.

나는 스크립트가 bash에 있는 것을 선호하지만 그것에 대해 너무 까다롭지는 않습니다.

답변1

이 작업이 완료됩니다(내 시스템에서는 약 40초 소요).

#!/bin/bash
[ "$BASHPID" = "$$" ] || { echo "Must run in a new process group"; exit 1; }>&2
cnt0() { cnt0=$#; }
cnt1() { cnt1=$#; }

tmpd=
trap 'rm -rf "$tmpd"; exit 1' INT HUP QUIT EXIT
tmpd=$(mktemp -d)
mkfifo "$tmpd/fifo"
exec 4<>"$tmpd/fifo"
rm -rf "$tmpd"
trap - INT HUP QUIT EXIT


open_all()
{ 
    cnt0 /proc/self/fd/*; 
    while exec {fd}</dev/null; do :; done; 
    cnt1 /proc/self/fd/*;
    nopened=$((cnt1-cnt0));
    echo $nopened >&4;
    cat /proc/sys/fs/file-nr
    if ((nopened)); then
        sleep 10000000
    fi
}

( open_all )&
while :; do
    if read nopened <&4 && ((nopened)); then
        ( open_all )&
        continue
    fi
    break
done
kill -TERM -$$

/dev/null가능한 한 많이 서브셸에서 열어 작동합니다 (경우에 따라 약 1000-4000회 작동해야 함 ulimit -n). 하나 이상의 파일 설명자가 열려 있으면 파이프를 통해 부모에게 알리고 자식 셸은 일시 중지됩니다 sleep. 상위 프로세스는 하나의 하위 셸이 실패할 때까지 다른 하위 셸에서 프로세스를 계속하여 하위 프로세스의 성공적인 fd 할당에 응답합니다.

/proc/sys/fs/file-nr각 반복마다 ted가 표시되어 cat프로세스가 어떻게 진행되는지 알 수 있습니다.

프로세스가 끝나면 다음과 비슷한 결과를 얻게 됩니다.

...
778192  0       786806
779248  0       786806
780272  0       786806
781264  0       786806
782256  0       786806
783280  0       786806
784304  0       786806
785328  0       786806
786352  0       786806
./open_all: line 35: cannot redirect standard input from /dev/null: Too many open files in system
./open_all: line 18: fd: Too many open files in system
Terminated

여기서 배운 흥미로운 점 중 하나는 중복된 파일 설명자(dup 또는 fork에서)가 제한에 포함되지 않는다는 것입니다(파일 설명자가 많은 상위 프로세스를 생성해도 개수가 증가하지 않습니다).

답변2

껍데기

while true ; do cat > $(( $RANDOM * $RANDOM )).file & done; 루트가 아닌 경우 최대 프로세스 제한에 도달할 수 있습니다. 그렇다면 Perl 프로세스를 사용하여 파일을 엽니다. 해당 변수는 모르지만 sysctl을 사용하여 maxfiles를 낮출 수 있습니다.

관련 정보