Не давайте Mac засыпать во время ночных задач с помощью caffeinate
Используйте caffeinate на Mac, чтобы не дать уснуть Claude Code, Codex или сборкам ночью, проверить assertions через pmset и учесть лимит закрытой крышки.
caffeinate — это встроенный в macOS инструмент командной строки, который не позволяет Mac перейти в режим сна во время выполнения задачи. Наиболее полезная форма использования — caffeinate -i <ваша команда>: она оборачивает процесс, удерживает систему активной на всё время его работы и автоматически освобождает ресурсы в момент завершения. Если вы закрывали крышку ноутбука или отходили, а вернувшись обнаруживали, что ночной запуск Claude Code, Codex или длительная сборка прервались — это встроенное решение, не требующее установки ничего дополнительного. В статье рассматриваются значимые флаги, надёжный рецепт для ночных запусков, способ убедиться, что assertion действительно удерживается, и единственное жёсткое ограничение, которое caffeinate не может преодолеть.
Ключевые выводы
caffeinateпоставляется с macOS (начиная с OS X 10.8), не требует установки и прав администратора; создаёт assertion управления питанием через IOKit — тот же механизм, который используют такие приложения, как Xcode, чтобы не давать Mac засыпать.- На ноутбуке используйте флаг
-iдля предотвращения перехода в режим ожидания; флаг-sработает только при питании от сети и молча игнорируется при работе от батареи, а-dбез необходимости держит включённым дисплей. - Оборачивание команды (
caffeinate -i npm run build) автоматически освобождает assertion по завершении процесса — вы не сможете забыть его отключить. caffeinateсам по себе не удержит MacBook активным при закрытой крышке: закрытие крышки переводит устройство в режим clamshell sleep, который программный assertion не может переопределить при работе от батареи.- Запускайте ночных агентов внутри
tmux, чтобы assertion сохранялся при закрытии или сбое окна Terminal.
Что такое caffeinate на Mac (ответ за 10 секунд)
caffeinate — официальный инструмент командной строки macOS, создающий assertions управления питанием для изменения поведения системы при переходе в режим сна. Он поставляется по пути /usr/bin/caffeinate начиная с OS X 10.8 (2012 год), не требует установки и прав администратора. Под капотом он вызывает power-assertion API из IOKit — механизм, динамически запрашивающий у системы управления питанием определённое поведение — через IOPMAssertionCreateWithName, тот же официальный путь, которым пользуются приложения для поддержания Mac в активном состоянии во время работы.
Ключевое поведение для длительно выполняемых задач — режим обёртки. Если указана утилита, caffeinate создаёт assertions от её имени, и они сохраняются на всё время выполнения этой утилиты; в противном случае caffeinate создаёт assertions напрямую, и они сохраняются до его собственного завершения. Канонический пример из man-страницы — caffeinate -i make: caffeinate порождает процесс, запускает в нём make и удерживает assertion, предотвращающий переход в режим ожидания на всё время работы этого процесса.
Значимые флаги caffeinate
Discover how at OpenReplay.com.
На ноутбуке единственный важный флаг — caffeinate -i: он предотвращает переход системы в режим ожидания, позволяя при этом дисплею погаснуть, что именно и нужно для фонового агента или сборки. Полный задокументированный набор флагов шире, чем описывают большинство руководств:
| Флаг | Предотвращает | Примечания |
|---|---|---|
-i | Переход в режим ожидания | Стандартный выбор для разработчика; дисплей может погаснуть |
-d | Отключение дисплея | Держит экран включённым — расточительно для фоновой задачи |
-m | Переход диска в режим ожидания | Редко нужен для агентов, нагружающих CPU или сеть |
-s | Системный сон | Только при питании от сети |
-u | Объявляет активность пользователя | Одноразовый; сбрасывает таймер ожидания |
-t N | — | Автоматически завершается через N секунд |
-w pid | — | Удерживает assertion до завершения указанного PID |
Два нюанса, которые часто упускают. Во-первых, assertion -s действителен только при питании от сети — при работе от батареи он молча не выполняет никаких действий, поэтому это неверный выбор по умолчанию для ноутбука без подключения к сети. Во-вторых, если дисплей выключен, флаг -u включает его и предотвращает переход в режим ожидания; если при этом не указан таймаут через -t, этот assertion по умолчанию действует всего 5 секунд. Оборачивание задачи надёжнее голого assertion, поскольку assertion не может пережить саму задачу: caffeinate -i npm run build предотвращает сон во время сборки и освобождает ресурсы сразу по её завершении.
Рецепт для ночного агента
Чтобы Claude Code, Codex CLI или Aider работали всю ночь, оберните команду запуска агента напрямую и запустите её внутри терминального мультиплексора, чтобы ничто не зависело от того, остаётся ли открытым окно Terminal. Поскольку assertion живёт внутри процесса caffeinate, он умирает при закрытии или сбое Terminal — tmux обеспечивает настоящую надёжность:
# Запустить отсоединённую сессию tmux, которая удерживает assertion на всё время работы
tmux new-session -d -s agent 'caffeinate -i claude'
Если агент уже запущен в другой панели, не перезапускайте его — привяжите новый assertion к существующему идентификатору процесса с помощью -w:
# Найти PID, затем удерживать assertion до завершения этого процесса
pgrep -f claude
caffeinate -i -w <pid>
Прежде чем уйти на 8-часовой запуск, убедитесь, что assertion действительно удерживается. Во второй панели выполните:
pmset -g assertions
Запись PreventUserIdleSystemSleep в выводе подтверждает, что macOS не перейдёт в режим ожидания, пока выполняется ваша задача; когда обёрнутая команда завершится, эта строка исчезнет. Эта единственная диагностическая проверка — разница между надеждой и уверенностью в том, что ночной запуск защищён.
Может ли caffeinate удержать MacBook активным при закрытой крышке?
caffeinate сам по себе не удержит MacBook активным при закрытой крышке. Закрытие крышки переводит устройство в режим clamshell sleep, и программный assertion управления питанием не может это переопределить при работе от батареи — без исключений. Это ограничение, которое не может преодолеть ни один CLI-инструмент для поддержания активности, и именно поэтому задача прерывается в момент, когда вы складываете ноутбук и отключаете его от сети.
Работа при закрытой крышке поддерживается ровно в двух случаях. Первый — режим clamshell от Apple: Apple поддерживает использование MacBook с закрытой крышкой при подключении внешнего дисплея, клавиатуры и мыши, однако это требует строгого соблюдения условий — без внешнего монитора не работает и может создавать проблемы с теплоотводом. Рекомендуемая Apple конфигурация включает внешний дисплей, адаптер питания, а также внешнюю клавиатуру и мышь или трекпад. Второй случай — переключатель «Не переходить в режим сна при выключенном дисплее» в разделе «Системные настройки» → «Аккумулятор» → «Параметры», однако для корректной работы компьютер должен быть подключён к источнику питания, а не работать от батареи.
Если вам действительно нужна работа от батареи и при закрытой крышке — например, ноутбук в сумке, выполняющий задачу агента, — caffeinate не подходит для этого случая. Amphetamine создан именно для таких ситуаций: в его документации указано, что с Amphetamine ваш Mac не нуждается в дисплее, клавиатуре, мыши или адаптере питания для использования режима Closed-Display Mode, поскольку приложение использует общедоступный API для отключения требований Apple.
Полная картина в виде таблицы истинности:
| Сценарий | caffeinate -i | Battery > Options | Amphetamine |
|---|---|---|---|
| Крышка открыта, простой, от батареи | Остаётся активным | Остаётся активным | Остаётся активным |
| Крышка закрыта, от батареи | Засыпает | Засыпает | Остаётся активным |
| Крышка закрыта, от сети + внешний дисплей/клавиатура | Остаётся активным | Остаётся активным | Остаётся активным |
| Окно Terminal закрыто или упало | Assertion умирает | Не затронуто | Не затронуто |
| Обёрнутая команда завершилась | Автоматически освобождается | Не затронуто | Сессия продолжается |
Остановка и подводные камни
Остановите caffeinate с помощью Ctrl+C на переднем плане или дождитесь его автоматического завершения вместе с обёрнутой командой — паттерн обёртки намеренно затрудняет случайное оставление процесса запущенным. Стоит назвать возможные проблемы. Голый caffeinate без обёрнутой утилиты и без -t работает до тех пор, пока вы его не остановите; непрерывная работа Mac увеличивает расход батареи, повышает температуру компонентов и добавляет операции записи на SSD со временем, поэтому ограничивайте assertion рамками конкретной задачи. И поскольку assertion привязан к процессу, закрытие или сбой Terminal немедленно его уничтожает — именно поэтому стоит оборачивать агента в tmux, а не просто вводить caffeinate в надежде, что окно останется открытым всю ночь.
Когда стоит использовать другие инструменты
caffeinate — правильный инструмент, когда ваш Mac подключён к сети или крышка открыта, и вы хотите защитить конкретную ночную задачу с автоматической очисткой. Когда нужна работа от батареи при закрытой крышке, передайте управление Amphetamine с его сессионными настройками. А когда сборка или запуск агента достаточно тяжелы, чтобы выполняться несколько дней, более чистым решением нередко оказывается полный отказ от управления режимом питания ноутбука и перенос нагрузки на всегда включённый удалённый сервер — машину, которая никогда не засыпает, потому что изначально не предназначена для этого. Для ночного запуска на собственном Mac: оберните команду, проверьте assertion с помощью pmset -g assertions и спокойно идите спать.
Часто задаваемые вопросы
В чём разница между caffeinate -i и caffeinate -d?
Флаг -i предотвращает переход системы в режим ожидания, позволяя при этом дисплею погаснуть — это именно то, что нужно фоновому агенту или сборке, и правильный выбор по умолчанию на ноутбуке. Флаг -d предотвращает отключение дисплея, держа экран включённым и расходуя энергию впустую для фоновой задачи. Используйте -i для ночной работы в терминале и прибегайте к -d только тогда, когда дисплей действительно должен оставаться включённым — например, для мониторинговой панели.
Нужны ли caffeinate права sudo или администратора?
Нет. caffeinate не требует установки и прав администратора, поскольку использует публичный power-assertion API из IOKit — тот же официальный механизм, которым пользуются такие приложения, как Xcode, чтобы не давать Mac засыпать. Любой пользователь может запустить его напрямую из Terminal. Инструмент встроен в macOS по пути /usr/bin/caffeinate начиная с OS X 10.8, поэтому устанавливать ничего не нужно и никаких повышенных прав запрашивать не требуется.
Что происходит с caffeinate при закрытии окна Terminal?
Assertion немедленно умирает. Поскольку assertion управления питанием живёт внутри процесса caffeinate, закрытие или сбой окна Terminal завершает этот процесс и уничтожает assertion, позволяя Mac перейти в режим ожидания. Чтобы пережить закрытие или сбой окна, запустите задачу внутри tmux, обернув команду в caffeinate внутри сессии — тогда assertion будет привязан к отсоединённому процессу, который переживёт ваш Terminal.
Как запустить caffeinate только на заданное количество часов?
Используйте флаг -t с таймаутом в секундах. Например, caffeinate -i -t 28800 предотвращает переход в режим ожидания ровно восемь часов, после чего автоматически завершается и освобождает assertion. Это удобно, когда нужно задать фиксированное окно, а не привязывать assertion к времени жизни конкретной команды. Без флага -t или обёрнутой утилиты голый caffeinate работает до тех пор, пока вы вручную не остановите его с помощью Ctrl+C.