몇 달 전에 필자는 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.
truss -u libc.a::setrlimit ulimit -Su 100 2>| truss.out
다양한 쉘 환경 (bash, ksh, bash tmux 및 ksh tmux) 에서 실행 되는 4 가지 로그가 있습니다 . 어떤 구체적인 정보를 게시해야합니까? 각 파일의 길이는 약 150 줄이며 무엇을 찾아야할지 모르겠습니다.
truss
정말 뭔가 했습니까 ? ulimit
실행 파일이 아니어야하며 (쉘 내장) truss ulimit
실패해야합니다. 무엇을 which ulimit
쓰나요? --- 대신에 당신은 실행해야합니다 truss ksh -c "ulimit -Su 100"
과의 동일 bash
. 라이브러리 호출 ( -u
) 대신 syscall을 잡는 것이 더 안정적 일 수 있습니다 . truss ... 2>&1 | grep limit
먼저 시도 합니다.
ulimit
는 일반적으로 커널에 의해 처리되므로 vs의ulimit -Su
실제 커널 한계가 다른 것으로 보입니다 . ?를 사용하여 두 경우 모두에서 전화 를 확인할 수 있습니까?ksh
bash
setrlimit()
truss