RLIMIT_NPROC가 갑자기 당황했습니다.

RLIMIT_NPROC가 갑자기 당황했습니다.

내 작은 스크립트에서는 쉘을 시작한 다음 RLIMIT_NPROC를 작은 숫자(예: 5)로 설정합니다.한계

그런 다음 다음을 포함하는 쉘 스크립트를 실행하려고 합니다.

#!/bin/bash
echo hi
sleep 3

표준 입력을 통해 "./test.sh\n"을 보내고 결과를 기다립니다. 또한 ps --ppid <somepid> -o pid=첫 번째 PID의 하위 PID를 나열 하곤 했습니다 .

이 작업은 항상 오류와 함께 실패합니다 bash: fork: retry: No child processes. 얼마나 많은 하위 프로세스가 생성되었는지 확인하기 위해 제한을 RLIM_INFINITY로 설정하려고 시도했지만 하나만 나열되었습니다(자연스럽게 test.sh를 처리하는 쉘).

하위 프로세스 수를 적절하게 제한하는 방법(또는 더 일반적으로는 일종의 포크 폭탄을 제한하는 방법)은 무엇입니까? 저는 cgroup 및 기타 유사한 대안에 대해 알고 있지만 배우기 위해 이 글을 작성하려고 하는데 이 동작이 정말 혼란스럽습니다.

나는 RLIMIT_NPROC에 대한 문서에 "최대 프로세스 수(또는 더 정확하게는 Linux에서는 스레드)"와 생성된 많은 수의 스레드가 제한되어 있다고 명시되어 있지만 RLIMIT_NPROC를 늘릴 때만 가능하다고 생각했습니다. to 500은 프로그램이 작동하거나 이와 유사한 것이 합리적이지 않은 것 같습니다.

이 동작이 예상치 못한 경우 코딩 오류일 수 있으며, 이 경우 여기에 게시할 테스트 코드를 정리하려고 합니다.

답변1

RLIMIT_NPROC는 프로세스가 가질 수 있는 하위 프로세스의 수를 제어하지 않습니다.

총 프로세스 수를 제어합니다.사용자그럴 수도 있습니다. 좀 더 구체적으로 말하면, 프로세스별 설정이므로 프로세스가 fork(), clone(), vfork() 등을 호출할 때 해당 프로세스의 RLIMIT_NPROC 값은 다음과 같습니다.모두프로세스의 상위 프로세스의 프로세스 수사용자, 프로세스에 있는 하위 프로세스의 수가 아닙니다.

답변2

매뉴얼 페이지에 getrlimit(2)제한이 있다는 것을 이해합니다.(여기서는 관련 없음)은 실제 사용자로 실행될 수 있습니다.

당신이 무엇을 하고 있는지 잘 모르겠습니다. 그러니 양해해 주시기 바랍니다. 나열된 스크립트를 가져와서 아래 첨자로 실행하는 프로그램을 시작합니다. 동시에 psPID를 확인하기 위해 달려가셨나요?

사용자가 실행 중인 쉘은 확실히 하나이고, 스크립트를 시작하는 프로그램은 또 다른 것이고, 그런 다음 스크립트가 실행 중이면 ps는 5를 만듭니다. 이제 ps가 자체 내부 목적으로 스레드를 시작하려고 시도하면 5개의 프로세스 제한으로 인해 실패하게 됩니다.

당신이 설명하는 것은 무언가를 수행하는 방법을 알아보기 위한 일종의 실험처럼 보입니다. 당신이 정말로 해결하고 싶은 문제는 무엇입니까? 그것이 무엇인지 알지 못하면 더 나은 대안을 제안할 수 없습니다(또는 원하는 것을 수행하는 방법을 알려줄 수도 없습니다).

관련 정보