일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 공유 라이브러리는 왜 항상 같은 순서로 맵핑 될까?
- docker
- pwn
- z3 signed 이슈
- 리커버릿
- 임베디드 시스템 해킹
- VSCode C++ 표준 버전 수정
- std::cerr
- wsl2 복구
- vmware 반응 속도
- Recoverit
- 실시간로깅
- pip 에러 해결
- Python.h: No such file or directory
- OpenAI 개발
- c++
- Windows 부팅 오류
- 지훈현서
- Python3
- pwntools
- 개발
- DYNAMIC Section
- GEF
- GDB
- tool
- python3.11 설치
- Seccomp bypass
- python3.11 pip
- python
- vhdx 파일 복구
- Today
- Total
OZ1NG의 뽀나블(Pwnable)
[Tips][Python] subprocess.popen - OSError: [Errno 24] Too many open files 해결 본문
[Tips][Python] subprocess.popen - OSError: [Errno 24] Too many open files 해결
OZ1NG 2021. 11. 7. 21:38[*] 해당 에러는 파일이 ulimit에 설정된 한계보다 더 많이 열린 경우 발생합니다.
[원인]
ulimit -a 명령어로 확인 가능하고 보통 1024개입니다.
이 에러는 단순히 open()을 이용했다가 close를 안했을 때에도 발생하지만 subprocess.popen을 사용했을 때에도
발생합니다.
정확히 하면 popen의 옵션으로 stderr=subprocess.PIPE, stdout=subprocess.PIPE을 사용하였을 경우에 발생합니다.
- 원인(추정) : popen으로 실행한 바이너리에서 출력하는 로그를 파이썬에서 fd로 받아오는 것으로 추정합니다...
추정 근거 : fd를 사용할때 /proc/pid(python3)/fd에 fd번호로 파일이 생성되는데 모니터링 결과 해당 개수가 계속 늘어나는 것을 확인했습니다.
(정확한 원인을 아시는 분이 계시면 알려주시면 감사하겠습니다..!)
[해결 방법]
popen으로 실행한 프로세스를 종료할 때 p.stderr.close()와 p.stdout.close()을 해줘 열린 fd를 처리해주시면 됩니다.
(이때, p는 popen 핸들러입니다.)
- 해당 close메소드는 popen으로 실행시킨 결과를 받아올때 사용하는 communicate()를 사용할때 알아서 내부에서 실행시켜줍니다. 때문에 communicate()를 사용하는 경우에는 이런 방식을 사용하지 않아도 됩니다.
- 사실 popen이 정상적으로 종료되는 경우에는 사실 이런 문제는 발생하지 않을 것으로 생각됩니다. 저 같은 경우에는 외부 명령어(pkill)로 강제로 해당 프로세스를 종료시키고 다시 실행시켜 popen이 제대로된 종료 프로세스를 거치지 않아 이런 문제가 생긴 것으로 추측하고 있습니다.
실제 위의 처리를 해준 후 /proc/pid/fd에 fd파일 개수가 유지되는 것을 확인 할 수 있었습니다.
'Tips' 카테고리의 다른 글
[Tips] ipTIME A2000UA-4dBi 드라이버 설치기 + 모니터 모드 변환 (0) | 2022.01.14 |
---|---|
[WSL2] apt update를 할 때 에러나는 경우 (0) | 2021.11.19 |
[Tips][Python] requests_html 모듈 (0) | 2021.10.28 |
[Tips] Windows10 RDP 오류 - 방화벽 설정 (0) | 2021.10.25 |
[Python] WatchDog 모듈 - 미완 (0) | 2021.10.22 |