Codex 세션을 오갈 때마다 증식하는 좀비 프로세스들의 습격 (환장하겠네...)

최근 AI 코딩 에이전트 툴인 Codex 앱을 아주 유용하게 사용하고 있습니다. 여러 프로젝트와 워크스페이스를 오가며 코드 편집부터 설계, 디버깅까지 든든한 파트너 역할을 해주니까요.
하지만 기분 좋게 작업을 이어나가다 보면, 어느 순간 맥북이 비명을 지르기 시작합니다. 팬이 돌고 시스템이 무거워지는 느낌에 활성 상태 보기(Activity Monitor)를 켜보면… 그곳에는 좀비 프로세스의 대행진이 펼쳐져 있습니다.
1. 환장하는 좀비 프로세스의 습격
세션을 여러 번 바꾸거나 에이전트를 몇 차례 실행하고 나면, 백그라운드에서 죽지 않고 살아남은 유령 프로세스들이 기하급수적으로 늘어납니다.
끊임없이 증식하는 node 프로세스들
먼저 가장 만만한(?) node 프로세스들입니다. 각 세션마다 개별적인 툴 환경이나 로컬 서버를 띄우는 과정에서 생성된 것으로 보이는데, 세션이 닫혀도 메모리를 움켜쥔 채 죽지 않고 조용히 자리를 지키고 있습니다.

GPU를 갈아먹는(?) MTLCompilerService
Metal 컴파일러 서비스인 MTLCompilerService 프로세스들도 예외는 아닙니다. Chromium 기반의 UI나 브라우저 샌드박스 컴파일러가 계속 생성되면서 덩달아 불어나는 모양인데, 스크롤을 내려도 끝이 안 보입니다.

본진인 mcp-server 프로세스들의 대범람
가장 결정적인 주범은 바로 mcp-server 계열의 프로세스들입니다. 각 에이전트가 실행되면서 사용하는 MCP(Model Context Protocol) 서버들(예: 브라우저 제어, 파일 시스템 접근, 아티팩트 빌더 등)이 세션 전환 시 제대로 정리(Clean up)되지 않고 백그라운드에 그대로 남아 있습니다.

2. 왜 정리되지 않고 쌓여만 갈까?
보통 IDE나 에이전트 러너는 세션이 종료되거나 워크스페이스를 닫을 때 자신이 생성한 자식 프로세스(Subprocess)들에게 SIGTERM 이나 SIGKILL 시그널을 보내 확실히 정리해야 합니다.
하지만 Codex 앱이 비정상 종료되거나, 멀티 세션을 오가는 과정에서 프로세스 트리의 연결 고리를 잃어버리는(Orphaned) 상태가 발생하는 것으로 보입니다. 부모를 잃어버린 프로세스들이 시스템의 소중한 자원을 조금씩 야금야금 갉아먹는 것이죠.
3. 대안은 오직 ’껐다 켜기’뿐인가?
지금 당장 가장 확실한(?) 해결책은 슬프게도 Codex 앱을 완전히 종료했다가 다시 켜는 것입니다. 부모 프로세스가 완전히 내려가면서 그나마 엮여 있던 자식들도 정리되거나, 수동으로 찌꺼기를 찾아 지울 수 있으니까요.
하지만 매번 흐름이 끊기며 앱을 재부팅하는 것은 개발자 입장에서 무척 성가신 일입니다.
임시방편으로 터미널에서 좀비 MCP 서버들만 골라 죽이는 스크립트를 만들어 쓸 수도 있습니다:
# mcp-server 관련 프로세스만 강제 종료
pkill -f mcp-server
하지만 node 프로세스의 경우 다른 로컬 개발 서버(Astro, Next.js 등)와 엉킬 수 있어 killall node를 함부로 날리기도 조심스럽습니다. 결국 주기적으로 활성 상태 보기를 켜서 노가다로 정리하거나 앱을 재시작하는 악순환이 반복되고 있습니다.
마치며: Codex 개발팀, 제발 프로세스 좀 데려가세요!
에이전트가 강력해지고 기능이 다양해질수록 백그라운드에서 실행되는 툴과 MCP 서버의 개수도 많아집니다. 그만큼 프로세스 라이프사이클 관리가 엄청나게 중요해진 셈입니다.
도구 자체는 너무 훌륭하고 만족스러운데, 세션을 바꿀 때마다 좀비들이 쌓이는 걸 보면 한숨이 절로 나옵니다.
“제발 세션 끝날 때 프로세스 회수 좀 확실하게 해주세요…!” 오늘도 무겁게 가라앉은 맥북을 보며 조용히 Codex 앱을 종료했다가 다시 켜봅니다.