“ulimit -Su”는 대화식 로그인 서브 쉘에서 생성 된 사용자 프로세스 수와 생성 된 tmux 세션을 제한합니까?


5

몇 달 전에 필자는 tmux를 사용하여 AIX 7.1 서버에서 간단한 IDE를 작성하는 일련의 bash 스크립트를 작성했습니다. 내 스크립트 중 하나에 ulimit에 의해 설정된 한계까지 사용자 프로세스를 매우 빠르게 생성하는 버그가 있습니다. 이것은 매우 드물게 발생하며 (한 달에 한 번 정도),이 버그를 추적하는 데 몇 시간 실패했습니다. 그래서 당분간 소프트 사용자 프로세스 제한을 하드 제한보다 낮은 값으로 간단히 설정할 수 있다고 결정했습니다. 내 버그가 다시 나타날 때 서버의 다른 사용자에게 눈에 띄는 성능 저하가 발생하지 않도록 1024 대신 100). 불행하게도, "ulimit -Su 100"은 AIX 7.1의 bash에서는 작동하지 않지만 ksh에서는 작동합니다. 다음 해결 방법을 수행했습니다.

ksh를 기본 쉘로 만들었습니다.

$ chsh [username] /usr/bin/ksh

~ / .kshrc에 다음을 작성했습니다.

ulimit -Su 100  # works in ksh, but not in bash
/bin/bash -il   # start bash as an interactive login shell
exit            # once bash exits, exit from ksh, too

이제 쉘을 만들 때마다 ksh는 소프트 사용자 프로세스 제한을 설정하고 bash를 대화 형 로그인 쉘로 시작합니다 (여전히 ~ / .bash_profile을 소스로 원합니다). 이제 ksh에 설정된 사용자 프로세스 제한이 여전히 bash 서브 쉘에 적용됩니까? 최상위 bash 서브 쉘에서 다음을 실행했습니다.

$ ulimit -Sa
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) unlimited
pipe size            (512 bytes, -p) 64
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited

보시다시피 사용자 프로세스 한계는 1024로 설정되어 있습니다.

광산의 또 다른 주요 관심사는 ksh에 설정된 한계에 bash 서브 쉘의 tmux 세션에서 생성 된 프로세스가 포함되는지 여부를 아는 것입니다.

다른 세부 정보 : tmux에서 새 창을 만들 때마다 ksh가 호출되고 ~ / .kshrc가 소스 화되고 bash가 정상적으로 시작된다는 것이 확실합니다. 새로 생성 된 각 tmux 분할 창의 제목이 "ksh"(tmux 분할 창의 기본 제목은 포 그라운드에서 현재 프로세스의 이름 임)이기 때문에 이것이 사실이라고 생각하지만, 대신에 bash 프롬프트가 표시됩니다. ksh 프롬프트.

이것은 너무 많이 울렸으므로 요청하지 않으면 더 자세한 내용을 생략한다고 가정합니다.

편집 1 : 이상한 행동

트러스를 사용하거나 사용하지 않고 "ulimit -Su"(인수 없음)로 사용자 프로세스 제한을 가져 오려고하면 어떻게되는지보십시오.

$ truss ulimit -Su 2>| truss.out
100
$ ulimit -Su
1024

어쩌면 내가 도구를 잘못 사용하고 있지만 그게 이상하게 보입니다. 이 명령은 tmux 내에서 실행되었습니다.

편집 2 : 추가 정보

이 명령들은 서브 쉘이나 tmux가없는 일반 bash 프롬프트에서 실행되었습니다.

$ truss ksh -c "ulimit -Su 100" 2>&1 | grep limit
getrlimit64(9, 0x2FF1B988)                      = 0
setrlimit64(9, 0x2FF1B988)                      = 0
$ truss bash -c "ulimit -Su 100" 2>&1 | grep limit
appulimit(1005, 0)                              = 0x2001C000
bash: line 0: ulimit: max user processes: cannot modify limit: A system call received a parameter that is not valid.

의 한계 ulimit는 일반적으로 커널에 의해 처리되므로 vs의 ulimit -Su실제 커널 한계가 다른 것으로 보입니다 . ?를 사용하여 두 경우 모두에서 전화 를 확인할 수 있습니까? kshbashsetrlimit()truss
pabouk

나는 당신의 제안을 취했으며 이제 truss -u libc.a::setrlimit ulimit -Su 100 2>| truss.out다양한 쉘 환경 (bash, ksh, bash tmux 및 ksh tmux) 에서 실행 되는 4 가지 로그가 있습니다 . 어떤 구체적인 정보를 게시해야합니까? 각 파일의 길이는 약 150 줄이며 무엇을 찾아야할지 모르겠습니다.
Sam

truss정말 뭔가 했습니까 ? ulimit실행 파일이 아니어야하며 (쉘 내장) truss ulimit실패해야합니다. 무엇을 which ulimit쓰나요? --- 대신에 당신은 실행해야합니다 truss ksh -c "ulimit -Su 100"과의 동일 bash. 라이브러리 호출 ( -u) 대신 syscall을 잡는 것이 더 안정적 일 수 있습니다 . truss ... 2>&1 | grep limit먼저 시도 합니다.
pabouk December

난의 팬이 아니에요 which논의를 포함하여 여러 가지 이유에 대해 여기which truss제공합니다 /usr/bin/ulimit. 반면에, type ulimit제공합니다 ulimit is a shell builtin. 또한, 교체 ulimitenv ulimit에서 truss명령은 작동하지만 약간 다른 출력을 제공합니다. 추가 제안 조치의 결과로 내 질문을 편집하겠습니다.
Sam

답변:


3

자원 한도 소개

유닉스 계열 시스템에서 자원 제한에 의해 제어됩니다 getrlimit()setrlimit()시스템 호출. 이러한 제한은 프로세스마다 구성되며 새 프로세스가 생성 될 때 (예 :로 fork()) 상속됩니다 . 쉘에서 한계를 설정하려면 명령을 쉘에 빌드해야합니다 (자식 프로세스로 실행되지 않음). 정말 ulimit등 많은 쉘의 내장이다 ksh하고 bash.

관찰 된 행동

의 "내장"특성은 및 ulimit의 다양한 동작 을 설명합니다 .kshbash

사용자 프로세스 수 ( ulimit -u) 의 한계 는 setrlimit(RLIMIT_NPROC, ...)syscall에 의해 설정됩니다 . 이전 버전의 AIX에서는 RLIMIT_NPROC가 지원되지 않았습니다. <1> 지원이 AIX 6.1 <2 섹션 5.4.4 구현 된 변경 사항>에 추가 되어 ulimitin kshsetrlimit64()올바르게 사용 됩니다. 은 bash아마 AIX의 이전 버전과 호환되도록 컴파일이 제한을 제어 할 수 없습니다했다.

결론

ulimit내장을 사용할 수 있으며 ksh모든 하위 프로세스는 구성된 제한을 상속합니다. 쉘과 프로세스는 일반적으로 명시 적으로 호출하지 않는 한 자원 제한을 유지하고 유지하는 것과 아무 관련이 없습니다 setrlimit().

대안

AIX에는 이전 버전의 AIX에서도 작동해야하는 대안이 있습니다.

chdev -l sys0 -a maxuproc=100

참조 : 3 , 4


설명 주셔서 감사합니다! 이 사이트에서 좀 더 명성을 얻으면,이 답변에 공평한 의견을 제시 할 것입니다. :)
Sam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.