Điều Gì Giữ Mac Thức? Đây Là Cách Tìm Hiểu

Quạt Mac của bạn đang quay và màn hình không bao giờ tắt — có thứ gì đó đang giữ một power assertion, và macOS sẽ không ngủ cho đến khi nó được giải phóng. Tìm ra nguyên nhân chỉ mất chưa hai phút, nếu biết tìm ở đâu. Bài này hướng dẫn cách dùng Energy tab trong Activity Monitor và lệnh Terminal để xem mọi power lock đang hoạt động trên hệ thống.
Cách macOS power assertions hoạt động
macOS không chỉ ngủ theo bộ đếm thời gian. Trước khi tắt màn hình hay quay chậm ổ đĩa, kernel kiểm tra xem có process nào đang giữ power assertion không — đây là yêu cầu gửi qua IOKit, báo hiệu rằng máy cần tiếp tục hoạt động. macOS sẽ duy trì yêu cầu đó cho đến khi process giải phóng nó hoặc process kết thúc.
Hai loại assertion kiểm soát hầu hết hành vi ngủ. PreventUserIdleSystemSleep ngăn Mac ngủ hoàn toàn — ổ đĩa, màn hình, mọi thứ. PreventUserIdleDisplaySleep giữ màn hình sáng nhưng cho phép phần còn lại của hệ thống ngủ. Ứng dụng quản lý tải xuống, trình phát video, caffeinate chạy từ Terminal hay một công cụ như LidRun đều có thể giữ một trong hai loại này, tùy mục đích.
Assertion không phải là lỗi — đây là tính năng được thiết kế có chủ ý. Cơ chế giữ máy thức suốt một tác vụ AI qua đêm cũng chính là cơ chế mà một tab trình duyệt bị quên dùng để không cho Mac ngủ sau khi bạn đã ngừng xem video. Mục tiêu là phân biệt assertion nào bạn chủ động yêu cầu và assertion nào tự xuất hiện mà không được mời.
Sử dụng Activity Monitor để tìm nguyên nhân
Mở Activity Monitor từ Applications → Utilities, hoặc tìm kiếm bằng Spotlight. Nhấp vào tab Energy. Cột Preventing Sleep hiển thị Yes hoặc No cho mọi process hệ thống đang theo dõi — sắp xếp theo cột đó để đẩy các assertion đang hoạt động lên đầu danh sách.
Những thứ hay gặp ở đây: tab trình duyệt đang phát video tạm dừng, client đồng bộ đám mây đang tải lên, ứng dụng podcast, hoặc công cụ họp video vẫn giữ phiên mở dù bạn đã rời cuộc gọi. Nhấp chuột phải vào mục nào trông đáng ngờ và chọn Inspect Process để xem đường dẫn đầy đủ và process cha — thường là đủ để xác định nguyên nhân.
Activity Monitor là điểm khởi đầu tốt, nhưng có giới hạn. Công cụ CLI và daemon nền — kể cả caffeinate khởi chạy từ Terminal — có thể xuất hiện dưới tên chung hoặc không xuất hiện gì cả. Với những trường hợp đó, lệnh Terminal dưới đây cho bức tranh đầy đủ hơn.
Hướng dẫn liên quanGiữ Mac thức chỉ khi nó thật sự đang làm việcĐọc pmset -g assertions trong Terminal
Mở Terminal và chạy pmset -g assertions. Kết quả liệt kê mọi active power assertion trên hệ thống: loại assertion, tên do ứng dụng đặt, và process ID đã gửi yêu cầu. Phần tóm tắt ở đầu ra chia chúng thành Listed (đang hoạt động) và Timed Out (đồng hồ đã hết nhưng ứng dụng chưa giải phóng khóa).
Assertion đã hết thời gian vẫn có thể cản máy ngủ — process đã gửi yêu cầu, bộ đếm đã hết, nhưng khóa chưa bao giờ được thả. Nếu thấy PID nào lạ trong kết quả, hãy đối chiếu với lệnh ps aux | grep <PID> để xác nhận tên process.
Để dừng một CLI assertion như caffeinate, tìm PID trong kết quả pmset rồi chạy kill <PID> trong Terminal. Với assertion từ ứng dụng, thoát ứng dụng là đủ — giải phóng ngay lập tức. Nếu assertion không có chủ rõ ràng hoặc process đã crash, khởi động lại sẽ xóa hết mọi lock còn tồn đọng.
Một số assertion có timeout rõ ràng; số khác thì vô hạn. Một PreventUserIdleSystemSleep vô hạn từ một background agent bị treo hoặc crash có thể giữ Mac thức mà không có lý do hiển nhiên. Nếu máy của bạn thức liên tục dài bất thường, đây là thứ nên kiểm tra trước.
Assertions có chủ đích và assertions không mong muốn
Không phải assertion nào cũng cần xóa. Nếu bạn đang chạy phiên Claude Code dài, một tác vụ model cục bộ, hay Cursor agent qua đêm, có gì đó nên đang giữ assertion đó — dừng nó lại là hủy cả job. Câu hỏi đúng không chỉ là 'tại sao Mac mình đang thức?' mà là 'mình có chủ động bật cái này không?'
Ứng dụng quản lý tải xuống giữ máy không ngủ cho đến khi quá trình tải hoàn tất — đó là hành vi đúng. Trình phát video vẫn giữ assertion sau khi bạn đóng cửa sổ thì không. Công cụ bạn chủ động cấu hình — LidRun, caffeinate -i chạy bằng tay — là có chủ đích. Tab trình duyệt có video tạm dừng mà bạn quên thì không. Sự khác biệt nằm ở chủ ý của bạn, không phải cơ chế kỹ thuật.
Khi cần giữ máy thức lâu một cách có chủ ý, các guardrail là quan trọng: tự dừng khi pin thấp, theo dõi ngưỡng nhiệt, và giới hạn assertion theo process cụ thể để tự động giải phóng khi công việc xong. Chế độ process-watch của LidRun làm đúng việc này — giữ assertion chỉ khi process bạn chỉ định còn đang chạy, sau đó tự thả mà không cần bạn nhớ dừng. Cách hoạt động cụ thể được trình bày trong hướng dẫn auto-keep-awake-only-while-working.
Khi assertion đến từ ứng dụng không mong muốn, thoát ứng dụng là đủ. Nếu cùng một process cứ xuất hiện lại sau mỗi lần khởi động, hãy vào System Settings → General → Login Items và Background Items để kiểm tra xem có agent nào được đặt khởi động tự động không. Xóa hoặc tắt mục đó là dứt điểm vấn đề từ gốc.
Tính năng của the safe AI workload layer for Mac.
LidRun giữ công việc của bạn chạy tiếp khi đóng nắp, với cơ chế bảo vệ pin và nhiệt tích hợp sẵn.
Câu hỏi thường gặp
Mở Terminal và chạy pmset -g assertions. Kết quả liệt kê mọi active power assertion, ứng dụng nào đã gửi và loại assertion là gì. Nếu muốn giao diện đồ họa hơn, mở Activity Monitor, nhấp vào tab Energy, sắp xếp theo cột Preventing Sleep để xem process nào đang giữ wake lock.
Mỗi dòng cho biết loại assertion như PreventUserIdleSystemSleep, tên do ứng dụng đặt, và process ID. Phần tóm tắt ở đầu ra phân loại assertions đang hoạt động (Listed) và những cái đã hết hạn nhưng chưa được giải phóng (Timed Out). Cả hai nhóm đều có thể ngăn máy ngủ, và PID giúp bạn truy ra process nào đứng sau mỗi assertion.
Có. macOS và nhiều ứng dụng tải xuống bên thứ ba gửi PreventUserIdleSystemSleep assertion trong khi quá trình tải đang diễn ra, để Mac không ngủ và cắt ngang file. Khi tải xong, assertion được giải phóng và máy trở lại hành vi ngủ bình thường.
Thoát ứng dụng là đủ — assertions được giải phóng ngay lập tức. Với process CLI như caffeinate, tìm PID trong kết quả pmset -g assertions rồi chạy kill <PID> trong Terminal. Với system daemon hoặc background agent, vào Login Items trong System Settings → General, tắt hoặc xóa mục đó để nó không tự khởi động lại.