How to Use the caffeinate and pmset Commands in macOS Terminal to Control System Sleep States

In macOS, power management is governed by the powerd daemon and the IOKit Power Management architecture. Designed to maximize battery longevity on Apple Silicon MacBooks while minimizing heat output, macOS aggressively initiates display dimming, disk spin-down, and system sleep whenever user input pauses. However, when executing lengthy software compilation builds in Terminal, downloading massive multi-gigabyte dataset archives over SFTP, or projecting presentation slides during an executive lecture, premature system sleep interrupts critical background operations. Rather than installing third-party menu bar utilities that consume memory and introduce security risks, macOS incorporates two native, command-line power management tools: caffeinate for temporary execution assertions and pmset for persistent hardware power configuration.

Comparing caffeinate and pmset Operational Roles

While both utilities control sleep behaviour, they operate at different architectural layers. The table below delineates the functional differences between caffeinate and pmset:

Tool Utility Persistence Scope Administrative Authority Primary Use Case
caffeinate Ephemeral. Active only while the command or wrapped process runs. Standard user account; zero sudo required. Wrapping long-running scripts, renders, and downloads to prevent sleep mid-job.
pmset Persistent. Modifies system NVRAM and /Library/Preferences/. Elevated root administrator privileges (sudo). Calibrating display timeouts, hibernation modes, and scheduling power events.
pmset -g assertions Diagnostic query. Standard user account. Audits kernel power assertions to pinpoint which app is preventing sleep.

Preventing Sleep Ephemerally with caffeinate

The caffeinate utility creates an in-memory power management assertion that temporarily blocks the operating system from transitioning into idle sleep states.

1. Essential caffeinate Parameter Switches

Command Switch Kernel Assertion Applied Operational Behaviour
-d PreventUserIdleDisplaySleep Forces the external and built-in displays to remain fully illuminated.
-i PreventUserIdleSystemSleep Prevents CPU and system sleep, but allows the display screen to turn off.
-m PreventDiskIdleSleep Prevents connected hard disks and storage controllers from idling down.
-s PreventSystemSleep Prevents system sleep while the Mac is plugged into AC mains power.
-u UserIsActive Emulates active user presence; turns the display back on if dimmed.
-t <seconds> Timed assertion Automatically expires and terminates after the specified number of seconds.
-w <PID> Process monitoring Asserts awake state until the designated Process ID (PID) terminates.

2. Practical Execution Examples

To keep your display awake for exactly two hours (7,200 seconds) without touching the mouse:

caffeinate -d -t 7200

To run a heavy shell compilation or dataset sync and ensure macOS remains awake until the task finishes, wrap the target command directly:

caffeinate -i rsync -avz /Volumes/Data/ /Volumes/Backup/

When rsync completes its final transfer, caffeinate exits automatically and releases its power assertion, allowing macOS to sleep normally.

To attach an awake assertion to an already-running background daemon (e.g., PID 4821):

caffeinate -i -w 4821

Configuring Persistent Power Profiles with pmset

For permanent hardware configuration, pmset allows administrators to define independent power profiles depending on whether the MacBook is operating on Battery (-b), Mains Charger (-c), Uninterruptible Power Supply (-u), or All Profiles (-a).

1. Auditing Current Power Settings

pmset -g

The console outputs your active hardware timer values:

System-wide power settings:
Currently in use:
 standbydelaylow      10800
 standbydelayhigh     86400
 standby              1
 hibernatemode        3
 powernap             0
 displaysleep         10
 disksleep            10
 sleep                15

2. Setting Distinct Display and System Sleep Timers

To configure your Mac to turn off the display after 5 minutes and sleep after 15 minutes when on Battery, but never sleep when plugged into Mains AC power:

# Battery profile: conservative timeouts
sudo pmset -b displaysleep 5 sleep 15 disksleep 5

# Charger profile: high-performance workstation mode
sudo pmset -c displaysleep 30 sleep 0 disksleep 0

Setting sleep 0 completely disables automatic system idle sleep.

Calibrating Hibernation and Deep Standby Modes

On Apple Silicon and modern Intel Macs, hibernatemode governs how memory contents are preserved when the laptop lid is closed.

Hibernation Value RAM & NVMe Storage Status Wake Speed vs. Power Drain
hibernatemode 0 Leaves RAM powered; does not write memory image to disk. Instant wake; battery drains slowly during sleep. (Default on Mac Studio/mini).
hibernatemode 3 Leaves RAM powered, but writes a mirror copy to /var/vm/sleepimage. Standard “Safe Sleep” default on MacBooks. Wakes instantly from RAM, but recovers from disk if battery completely dies.
hibernatemode 25 Dumps RAM to disk and immediately cuts power to RAM completely. Slowest wake (reads image from SSD), but zero battery consumption while sleeping.

To set safe sleep with reduced standby delay:

sudo pmset -a hibernatemode 3 standbydelaylow 3600 standbydelayhigh 7200

Automating Scheduled Wake and Power Events

Enterprise lab servers or rendering workstations can be automated to boot or wake at predetermined schedules:

1. Setting a Recurring Morning Wake Schedule

To force a workstation to wake automatically every Monday through Friday at 07:30 AM:

sudo pmset repeat wake MTWRF 07:30:00

2. Auditing Scheduled Events

pmset -g sched

To cancel all scheduled power events:

sudo pmset repeat cancel

Diagnosing Rogue Sleep Prevention with pmset -g assertions

If your MacBook drains battery overnight inside a closed laptop bag or refuses to enter sleep, an unclosed application is likely holding a kernel power assertion.

pmset -g assertions

Inspect the output under Listed by owning process:

pid 712(sharingd): [0x000001a40001815b] 00:42:12 PreventUserIdleSystemSleep named: "AirDrop transfer in progress"
pid 942(Google Chrome): [0x000000a100018042] 02:14:50 NoDisplaySleepAssertion named: "WebRTC audio stream"

The diagnostic output exposes the exact Process ID (PID) and internal reason string preventing system sleep, allowing you to terminate or reconfigure the offending software.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.