12k
All articles

Не давайте Mac засыпать во время ночных задач с помощью caffeinate

Используйте caffeinate на Mac, чтобы не дать уснуть Claude Code, Codex или сборкам ночью, проверить assertions через pmset и учесть лимит закрытой крышки.

OpenReplay Team
OpenReplay Team
Не давайте Mac засыпать во время ночных задач с помощью caffeinate

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

На ноутбуке единственный важный флаг — 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 -iBattery > OptionsAmphetamine
Крышка открыта, простой, от батареиОстаётся активнымОстаётся активнымОстаётся активным
Крышка закрыта, от батареиЗасыпаетЗасыпаетОстаётся активным
Крышка закрыта, от сети + внешний дисплей/клавиатураОстаётся активнымОстаётся активнымОстаётся активным
Окно 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.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.