OZ1NG의 뽀나블(Pwnable)

[Tips][Python] subprocess.popen - OSError: [Errno 24] Too many open files 해결 본문

Tips

[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파일 개수가 유지되는 것을 확인 할 수 있었습니다.

 

Comments