왜 내 로컬 AI 에이전트는 맥을 닫으면 멈추나 — 슬립·launchd·토큰 함정
자기 노트북에서 개인 AI 에이전트를 24시간 굴리기 시작하면 두 개의 벽에 부딪힌다. 하나는 “왜 맥 뚜껑을 닫으면 에이전트가 멈추나”라는 OS·하드웨어 레벨의 벽이고, 다른 하나는 “요금제를 올렸는데 왜 쿼터 에러가 계속 나나”라는 인증 토큰의 벽이다. 이 글은 개인 맥에 상시 가동형 에이전트(브리핑·우편함 배달·모니터링을 도는 봇)를 올려 쓰다 그 두 벽을 실제로 넘은 트러블슈팅 기록이다.
벽 하나 — 뚜껑을 닫으면 왜 멈추나
먼저 슬립의 정체부터. 맥의 슬립은 CPU 전원을 내리고 RAM만 유지하는 상태다. CPU가 멈춰 있으니 어떤 프로세스도 명령어를 실행할 수 없다. 슬립은 프로세스를 죽이는 게 아니라 통째로 얼렸다가 깨우는 것이고, 이는 OS·하드웨어 레벨이라 소프트웨어로 뚫을 수 없다. 그리고 뚜껑을 닫으면 무조건 슬립이다.
그래서 상시 가동은 두 갈래뿐이다.
- 슬립을 막는다: 전원을 연결한 채
caffeinate -s를 걸거나, 외부 모니터를 연결해 뚜껑을 닫아도 안 자는 클램셸 모드로 쓴다. - 클라우드로 옮긴다: VPS로 이전해 슬립이라는 개념 자체를 없앤다.
pmset schedule이나 Power Nap으로는 임의 프로세스를 대신 돌려주지 못한다.
”죽지 않게”와 “재우지 않게”는 다른 문제다
여기서 자주 섞이는 두 문제를 갈라야 한다.
- 죽지 않게 만들기: 에이전트 게이트웨이를 launchd(LaunchAgent)로 등록하면 로그인 시 자동 시작, 죽으면 즉시 재시작, 슬립에서 깨면 자동 복구가 된다.
- 재우지 않게 만들기: 위의 슬립 대책(전원+caffeinate 또는 클램셸)이다.
즉, launchd는 프로세스를 되살릴 뿐 슬립을 막지는 못한다. 상시 가동을 원하면 둘 다 풀어야 한다.
그럼 도커로 격리하면 되지 않나 (아니다)
흔한 다음 생각은 “도커나 VPS로 격리하면 슬립도 보안도 한 번에 풀린다”이다. 둘 다 오해다.
맥의 도커는 리눅스 VM 위에서 돌기 때문에 슬립 문제를 전혀 풀지 못한다 — VM도 CPU가 멈추면 같이 멈춘다. 보안(프롬프트 인젝션 방어) 관점에서도 헛다리다. 비유하자면 이렇다.
도둑이 들어왔을 때 금고(맥 전체)는 잠갔는데, 정작 현금(시크릿·토큰·네트워크)은 도둑이 있는 방 안에 같이 둔 격.
인젝션의 진짜 위험 자산 — .env 시크릿·봇 토큰·네트워크 접근권 — 이 컨테이너 안에 그대로 들어가므로, 컨테이너 경계는 그 위험을 막지 못한다.
VPS 이전도 트레이드오프가 분명하다.
- 이득: 개인 맥과 분리돼 인젝션 피해가 VPS에 갇히고, 슬립 문제가 사라진다.
- 손해: 인터넷에 직접 노출돼 침입 표면이 커진다(SSH·포트 하드닝 필수). 시크릿이 제3자 인프라로 이전된다.
결정적으로, 프롬프트 인젝션 자체는 VPS로 풀리지 않는다. 같은 토큰·같은 권한·같은 네트워크를 그대로 들고 가기 때문이다. 그래서 우선순위는 인젝션 방어(승인 게이트·최소권한·시크릿 위생)가 1번, 환경 분리(VPS)가 2번이다. 분리만 하고 방어를 빼면 “잘 격리된 채 그대로 털리는” 상태가 된다.
벽 둘 — 요금제를 올렸는데 쿼터 에러가 계속된다
두 번째 벽은 결이 완전히 다른, 인증의 함정이다. 증상은 이랬다. 에이전트의 LLM 백엔드가 쿼터 에러를 계속 뱉으며 응답 불능에 빠졌고, 로그에는 이런 메시지가 떴다.
Codex provider quota exhausted (429); retry after 1123746sretry after가 약 13일 뒤였다. 1차 연료가 소진됐고, 폴백으로 넘어간 2차·3차 연료통도 전부 비어 있었다. 폴백 배선 자체는 정상 작동 중이었으나, 도달한 모든 연료통이 비어 두뇌가 없는 상태였다(착지점의 크레딧이 $0이라 다음으로 넘어갔고, 그마저 크레딧 부족으로 거부됐다).
그래서 요금제를 상위 플랜으로 올렸다. 그런데도 쿼터 에러가 계속됐다.
함정의 정체 — 등급은 토큰에 박혀 온다
원인은 뜻밖이었다. 요금제 등급이 설정 파일이 아니라 OAuth 토큰 안에 박혀 온다. 업그레이드 전에 발급된 옛 토큰의 등급이 여전히 무료로 고정돼 있었고, 인증 파일(auth.json)은 업그레이드 전 날짜 그대로였다. 설정에 요금제를 직접 써넣는 값이 아니었던 것이다.
즉, 해법은 설정 수정이 아니라 재로그인이다. 재인증해 새 토큰을 받아야 상위 요금제가 반영된다.
관찰 하나를 정정한 것도 남길 만하다. 대시보드에는 잔액이 남아 보이는데 API가 거부하길래 처음엔 “만료된 크레딧” 탓으로 추정했으나, 재확인 결과 실제로 소진된 잔액이었다. 대시보드 표시 잔액과 실제 사용 가능 잔액은 다를 수 있다.
정리 — 로컬 상시 가동의 체크리스트
두 벽을 넘고 남은 실전 교훈은 이렇다.
- 로컬 맥 상시 가동은 “죽지 않게”(launchd)와 “재우지 않게”(전원+caffeinate 또는 클램셸)를 둘 다 풀어야 한다. 뚜껑 닫으면 무조건 슬립이라는 하드 제약은 소프트웨어로 못 뚫는다.
- 도커 컨테이너 경계는 슬립도 인젝션도 풀지 않는다. 격리하려거든 위험 자산이 경계 어느 쪽에 있는지부터 봐라.
- VPS는 인젝션 방어의 대체재가 아니다. 방어가 먼저고, 격리는 그다음이다.
- “요금제를 올렸는데 안 먹힌다”면 OAuth 토큰을 의심하라. 등급이 토큰에 박히는 서비스는 재로그인 전까지 옛 등급으로 인식한다.
- 대시보드 잔액을 곧이곧대로 믿지 마라. 실제 가용액과 다를 수 있다.