내 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를 낮출 수 있습니다.