MacBook 뚜껑을 닫아도 Claude Code가 멈추는 문제 방지 방법 (pmset 사용)
요약
MacBook 뚜껑을 닫아도 Claude Code 세션이 중단되는 문제는 Mac의 절전 모드(Clamshell Sleep) 진입 때문입니다. 이를 방지하려면 외출 시에만 `sudo pmset -a disablesleep 1` 명령어를 사용하여 macOS의 절전 기능을 비활성화하는 것이 가장 확실한 방법입니다.
핵심 포인트
- 뚜껑을 닫아도 세션을 유지하려면 `pmset -a disablesleep 1` 사용.
- 일반적인 `--bg`, Remote Control, `caffeinate`로는 뚜껑 닫힘 상태의 절전 모드를 막기 어려움.
- 절전 모드 진입 시 통신 중이던 요청은 시간 초과(Request timed out)가 발생할 수 있음.
결론
MacBook의 뚜껑을 닫아도 Claude Code를 멈추고 싶지 않다면, 외출 중일 때만 macOS의 절전 모드를 비활성화합니다.
# 뚜껑을 닫기 전에 (일반 터미널에서)
sudo pmset -a disablesleep 1
# 돌아왔으면 원래대로 되돌리기
...
--bg,
원격 제어(Remote Control), caffeinate,
데스크톱 앱의 Keep computer awake로는 뚜껑을 닫았을 때의 절전 모드를 막을 수 없습니다. 클라우드 세션(
claude --cloud) extsc{도} 뚜껑이 닫힌 상태로 진행되지만, 추천하지 않습니다. 사용 환경 자체를 그대로 사용할 수 없고 제약이 많기 때문입니다 -
disablesleep
은 문서에 없는 옵션입니다. 전원, 열, 그리고 원래대로 되돌리는 것을 주의하세요.
작동 확인: macOS 26.6.2 (25G83), Apple M4 Pro, Claude Code 2.1.294. 공식 문서를 인용하고 pmset
실측은 둘 다 2026-10-08 시점의 것입니다.
무슨 일이 일어났는가
밤에 Claude Code의 subagent를 실행한 채 MacBook의 뚜껑을 닫았더니, 다음 날 아침 Request timed out
으로 중단되어 있었습니다.
원인은 코드나 API가 아니라 Mac의 절전 모드였습니다. pmset -g log
을 보면, 뚜껑을 닫은 시점에 Clamshell Sleep (뚜껑을 닫아 발생하는 절전 모드)에 진입해 있었습니다. 실행 중이던 요청은 거기서 끊겼고, 오류는 몇 시간 후에 Mac이 일시적으로 깨어났을 때 (DarkWake) 기록되어 있었습니다.
--bg・Remote Control・caffeinate로는 막을 수 없다
먼저 효과가 없는 것들을 정리하겠습니다. --bg
과 Remote Control은 사용 중인 Mac 위에서 작동하기 때문에, Mac이 잠들어 있는 동안에는 진행되지 않습니다. caffeinate
이나 데스크톱 앱의 Keep computer awake는 유휴 절전 모드(idle sleep)에만 효과가 있습니다.
| 수단 | 역할 |
뚜껑을 닫은 상태에서 |
|---|---|
claude --bg (background session) | 사용 중인 Mac에서 세션을 백그라운드로 실행 |
진행되지 않음. 절전 모드를 넘어서 유지되지만, 깨어났을 때 재개됨 |
| Remote Control | 사용 중인 Mac의 세션을 스마트폰이나 브라우저에서 조작 |
진행되지 않음. Mac이 복구되면 자동으로 재연결됨 |
caffeinate (플래그 없음 / -i ) | 유휴 절전 모드를 방지 |
잠들 수 있음 |
| 데스크톱 앱의 Keep computer awake | 유휴 절전 모드를 방지 |
잠듦
--bg
의 background session에 대해 공식 문서는 다음과 같이 작성되어 있습니다.
Sessions are local: background sessions run on your machine. They are preserved across sleep but stop if the machine shuts down.
Sessions are also preserved when your machine sleeps. Their processes resume on wake and the supervisor reconnects to them instead of treating the time gap as idle.
다만 서두의 예시처럼, 잠든 시점에서 통신 중이던 요청은 시간 초과가 발생할 수 있습니다 (제 사례는 --bg
가 아닌 일반 세션이었습니다).
Remote Control도 마찬가지입니다. 스마트폰이나 브라우저에서 조작할 수 있어도, 본체는 Mac 위에서 작동하고 있습니다.
When you start a Remote Control session on your machine, Claude keeps running locally the entire time, so your code execution and filesystem access stay on your machine.
중간 끊김 방지: 노트북이 절전 모드에 들어가거나 네트워크 연결이 끊어져도 Claude Code는 기기가 다시 온라인 상태가 되면 자동으로 재연결됩니다.
caffeinate
은 플래그 없이도 -i만으로 PreventUserIdleSystemSleep이라는 단언(슬리프를 막으라는 요청)을 생성합니다 (pmset -g assertions로 확인 가능). macOS SDK의 IOPMLib.h에는 이 단언에 대해 다음과 같이 명시되어 있습니다.
The system may still sleep for lid close, Apple menu, low battery, or other sleep reasons.
-s는 man caffeinate에 'AC 전원일 때만 유효함'이라고 되어 있습니다. -s를 사용한 덮개 닫힘 시의 동작은 테스트하지 않았습니다.
데스크톱 앱의 Keep computer awake도 마찬가지로, 공식 문서(Desktop 스케줄링 작업)에는 다음과 같이 쓰여 있습니다.
To prevent idle-sleep, turn on
Keep computer awake in Settings > This computer > System. Closing the laptop lid still puts it to sleep.
사실, 유휴 슬리프는 Claude Code 자체가 이미 방지하고 있습니다. ps로 보면 작업 중인 claude 프로세스의 자식으로 caffeinate -i -t 300이 실행되고 있었습니다 (CHANGELOG에도 'Fixed caffeinate process not properly terminating when Claude Code exits'라는 수정 사항이 있습니다). 구멍은 덮개를 닫았을 때만 그렇다는 것입니다.
자리를 비울 때만 슬리프를 무효화하기
Claude Code를 손에 든 Mac에서 계속 실행하려면, Mac을 잠들지 않게 할 수밖에 없습니다. 자리를 비울 때만 슬리프를 막습니다.
# 덮개를 닫기 전에
sudo pmset -a disablesleep 1
# 돌아왔을 때 원래대로 되돌리기
...
효과가 있는지 여부는 pmset -g로 알 수 있습니다.
$ pmset -g | grep SleepDisabled
SleepDisabled 1
! (bash 모드)이 아니라 일반 터미널에서
sudo를 Claude Code의 Claude Code 안에서 ! (bash 모드)를 붙여 실행하면, 비밀번호 입력이 필요한 기본 설정에서는 입력할 터미널이 없기 때문에 실패합니다.
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
'터미널' 앱과 같은 일반 터미널에서 실행해 주세요.
작동 여부 확인하기
슬리프와 웨이크 기록은 pmset -g log에 남아 있습니다.
pmset -g log | grep -E
2026-10-08 12:14:00 +0900 Sleep Entering Sleep state due to 'Idle Sleep':... Using Batt (Charge:100%) 442 secs
2026-10-08 12:52:36 +0900 Sleep Entering Sleep state due to 'Idle Sleep':... Using Batt (Charge:100%) 84 secs
2026-10-08 12:54:00 +0900 Wake Wake from Deep Idle [CDNVA] : due to ... HID Activity Using BATT (Charge:100%)
설정 파일 업데이트 시점부터 `disablesleep`을 활성화한 것은 12:54입니다. 그 전까지는 12:14나 12:52 등에 절전 모드에 들어갔지만, 활성화된 12:54 이후로는 한 줄도 늘어나지 않았습니다. 중간에 커버를 한 번 닫았지만, 15:49에 봐도 마지막 줄은 12:54의 `Wake` 상태 그대로였습니다 (배터리 구동).
### grep을 너무 광범위하게 사용하면 assertion 행에 묻힙니다
처음에는 `grep -E "Sleep |Wake "`로 검색했지만, 이는 `PreventUserIdleSystemSleep`을 포함하는 assertion 행까지 모두 가져옵니다.
2026-10-08 15:04:25 +0900 Assertions PID 23853(caffeinate) ClientDied PreventUserIdleSystemSleep "caffeinate command-line tool" 00:03:05 ...
이 `caffeinate`는 앞서 언급한 Claude Code 자체가 실행하고 있는 것입니다. 끝날 때마다 한 줄씩 늘어나기 때문에, `tail`로 보면 실제 절전 모드 기록이 가려집니다. 위 명령어처럼 유형(`Sleep`/`Wake`/`DarkWake`) 뒤에 공백이 두 개 이상 연속되는 행만 가져오면, 절전 모드와 웨이크(wake) 기록만 남습니다. 예정된 웨이크 요청 목록 (`Wake Requests`)도 제외할 수 있습니다.
### AppleClamshellCausesSleep은 Yes 상태를 유지합니다
`ioreg`으로 확인했을 때, `disablesleep`을 활성화했음에도 불구하고 커버를 닫으면 절전 모드에 진입하는지 여부를 나타내는 플래그는 `Yes` 상태를 유지했습니다 (`AppleClamshellState = No`는 육안으로 볼 때 커버가 열려 있었다는 의미입니다).
$ ioreg -r -k AppleClamshellState -d 4 | grep -E '"AppleClamshell(State|CausesSleep)"'
| "AppleClamshellCausesSleep" = Yes
| "AppleClamshellState" = No
그럼에도 불구하고 실제로는 절전 모드에 진입하지 않았습니다. 이 플래그가 아니라, `pmset -g log`으로 확인하는 것이 확실합니다.
## 왜 플래그가 Yes 상태여도 절전 모드에 들어가지 않는가 (XNU 소스)
공개된 XNU 소스 (`IOPMrootDomain.cpp`)를 읽어보면 이유를 알 수 있습니다. `AppleClamshellCausesSleep`을 결정하는 `shouldSleepOnClamshellClosed()`는 `SleepDisabled`을 확인하지 않습니다. 반면, `SleepDisabled`을 받으면 `userDisabledAllSleep`이 작동하며, 커버를 닫았을 때의 절전 모드 요청 역시 `checkSystemSleepAllowed()`에서 거부됩니다 (주석에는 '사용자 영역 절전 모드 차단 스위치'라고 되어 있습니다. AC(외부 전원)와 배터리 모두 동일하게 취급됩니다).
## 클라우드 세션을 추천하지 않는 이유
클라우드 세션 (`claude --cloud`)은 기본적으로 Anthropic이 관리하는 격리된 VM에서 작동하기 때문에, 커버를 닫아도 계속 진행됩니다. 공식 문서에도 이렇게 명시되어 있습니다.
The session keeps running after you close your laptop, and you can check on it or steer it from any device.
그럼에도 불구하고 추천하지 않는 이유는, 사용자의 로컬 환경을 그대로 사용할 수 없고 제약이 많기 때문입니다.
- **로컬 Mac에 있는 것에는 접근할 수 없습니다**: 로컬 DB, `localhost` 서비스, SSH 터널링, 로컬에만 존재하는 인증 정보는 사용할 수 없습니다 -
- **클론되는 것은 GitHub 상의 브랜치뿐입니다**: VM은 현재 디렉터리의 GitHub 원격 저장소(remote)를 현재 브랜치로 클론합니다. 사용자의 체크아웃 상태가 아니므로, **로컬 커밋은 먼저 push**해야 합니다. 참고로, 원격 저장소가 없거나 Claude GitHub App이 설치되어 있지 않은 경우, 로컬 리포지토리를 묶어 업로드합니다 (추적되지 않는 파일은 포함되지 않습니다) -
- **현재 터미널 세션은 옮길 수 없습니다**: CLI를 통해서는 일방통행이며, 클라우드에서 터미널로 (`--teleport`)만 가능합니다. 데스크톱 앱의 경우, 'Open in' 메뉴에서 로컬 세션을 클라우드로 전송할 수 있습니다 -
- **사용 가능한 조건이 있습니다**: Pro / Max / Team 플랜 (Enterprise는 대상 좌석), claude.ai 계정으로 로그인해야 합니다. Amazon Bedrock과 같은 서드파티를 통해서는 사용할 수 없습니다. 조직의 정책 `allow_remote_sessions`도 활성화되어 있어야 합니다 -
- **방치하면 VM이 회수됩니다**: 잠시 조작이 없으면 세션이 중지합니다. 다시 시작하면 대화 내용은 돌아오지만, 그때 실행되던 subagent나 셸 명령어는 돌아오지 않습니다.
## 그래도 사용할 경우의 커맨드
새로운 클라우드 세션을 생성
claude --cloud "인증 관련 버그를 수정해줘"
실행 중인 세션에 추가 지시를 보냄 (-p가 필요. 응답을 기다리지 않고 종료됨)
...
`-p ... --cloud`
에 전달되는 `<session-id>`는 `session_...`나 `cse_...` ID, 또는 claude.ai/code의 세션 URL입니다. 진행 과정은 claude.ai/code나 Claude 모바일 앱에서 확인할 수 있습니다. `--remote`는 `--cloud`의 이전 이름이며, 현재는 사용이 권장되지 않는 별명입니다.
`--teleport`는 동일한 리포지토리의 체크아웃 상태로 실행합니다. 클라우드 세션의 브랜치가 원격에 push되어 있어야 합니다. 커밋되지 않은 변경 사항이 있으면 stash 하도록 요청받습니다. 가져온 후의 작업은 로컬 복사본에만 남아있고, 클라우드 측 세션에는 반영되지 않습니다.
`claude --help` (2.1.294) 에서는 `--cloud`로 기존 세션에 'attach'할 수 있다고 되어 있습니다. 반면, CLI 레퍼런스에서는 기존 세션에 `-p`를 붙여 메시지를 보내는 형태입니다.
With a session ID (`session_...` or `cse_...`) or a claude.ai/code URL, queue a message into that existing session instead, with `-p`.
`-p`가 없는 attach는 문서에 나와 있는 오류 `Attaching to an existing cloud session is not enabled for your account.`와 같이 계정별로 활성화 여부가 결정되는 것 같습니다. 기존 세션에는 `-p`를 붙여 보내는 것이 확실합니다 (`-p`가 없는 동작은 로컬에서 시도해보지 않았습니다).
## 검증 범위
- **뚜껑을 닫았을 때의 테스트는 단 한 번입니다**. 닫고 있던 시간은 기록하지 않았습니다. 배터리 구동 상태일 때만, 전원에 연결된 상태, 하룻밤 동안, 외부 디스플레이를 연결한 상태는 시도하지 않았습니다 -
- **재부팅 후에도 설정이 유지되는지는 테스트하지 않았습니다**. 설정 파일에는 저장되어 있었습니다 -
시도하지 않은 것: `caffeinate -s`로 뚜껑을 닫았을 때의 동작 -
문서의 오류표를 읽었을 뿐입니다: `--cloud`에 `-p` 없이 기존 세션을 전달했을 때의 동작 -
**XNU 설명은 공개 소스 (main)를 읽은 것이므로, macOS 26.6.2 커널과 같다고 할 수 없습니다.** `pmset` 설정이 이 `SleepDisabled`
として渡ることも、名前の一致から判断しています
## 요약
- ✅ 외부 디스플레이가 없다면, 덮개를 닫을 때 Mac은 잠들고, 잠들어 있는 동안 Claude Code도 진행되지 않습니다.
`--bg`
또한 Remote Control 역시 작동하는 것은 손에 들고 있는 Mac입니다. - ✅ 유휴 슬립(idle sleep)은 Claude Code 자체의 `caffeinate`가 막아주고 있습니다. 덮개는 닫았을 때만 문제가 됩니다. - ✅ 덮개를 닫아도 멈추고 싶지 않다면, `sudo pmset -a disablesleep 1`를 사용하세요. 문서에 없는 옵션이므로 전원, 열, 되돌리는 것을 주의하세요. - ✅ `sudo`는 Claude Code의 `!`가 아니라 일반 터미널에서 확인합니다. - ✅ 확인은 `pmset -g log`를 `
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기