Giữ Mac thức chỉ khi nó thực sự đang chạy việc

Trả lời ngắn gọn: Mac chỉ thức khi có một tác vụ thực sự đang chạy, chứ không phải chỉ vì một app đang mở cửa sổ nào đó — điều này chỉ khả thi khi có thứ gì đó theo dõi hoạt động CPU theo từng tiến trình, thay vì chỉ kiểm tra xem tiến trình đó có tồn tại hay không. Đó chính là điều cần để tự động giữ Mac thức chỉ khi nó thực sự đang chạy việc, và buông ra ở mọi lúc còn lại — và đó chính xác là việc mà Auto Mode của LidRun làm. Hầu hết công cụ giữ máy thức chỉ có một nút: bật. Bật lên, Mac thức, và nó cứ thức mãi rất lâu sau khi công việc cần nó đã xong từ đời nào. Quy tắc của LidRun hẹp hơn nhiều: agent đang chạy thì giữ thức; agent xong việc hoặc mất an toàn thì nhả ra, để Mac ngủ. Bài này nói về cách nó thực sự hoạt động, gồm cả những cách dòng lệnh miễn phí để đi được nửa đường, và điểm mà chúng hết đường đi.
Một app đang mở không phải là một app đang làm việc
Một khóa giữ thức (wake lock) thông thường không thể phân biệt giữa một bản build đang cày miệt mài và một trình soạn thảo đã đứng yên cả tiếng đồng hồ. Với nó, cả hai chỉ là những tiến trình đang tồn tại, nên nó giữ Mac thức trong mọi trường hợp — và cứ giữ như vậy rất lâu sau khi công việc đã thực sự xong.
Nhưng "app đang mở" và "app đang làm việc" là hai chuyện khác nhau. Claude Code đứng ở prompt chờ bạn gõ lệnh không hề tốn CPU. Một daemon Ollama chưa load gì cả cũng không hề tốn CPU. Giữ Mac thức vì một trong hai trường hợp đó chỉ là đang xả pin vô ích.
Auto Mode vạch ranh giới ở mức độ hoạt động, không phải sự hiện diện. Nó theo dõi một danh sách công cụ dev và AI, và với mỗi công cụ nó đặt một câu hỏi sắc hơn: tiến trình này có đang thực sự bận ngay lúc này không, hay chỉ đơn thuần đang chạy?
Cách miễn phí mà ai cũng thử trước: caffeinate và pmset
macOS đã có sẵn hai cách để đi được nửa đường này miễn phí, và đáng để biết trước khi tìm đến bất kỳ app nào. caffeinate là công cụ dòng lệnh có sẵn: chạy caffeinate -i npm run build và Mac sẽ không tự ngủ do rảnh (idle-sleep) miễn là lệnh đó còn chạy. Ngay khi bản build xong, caffeinate cũng thoát theo, và assertion biến mất. Đây thực sự gần với việc giữ Mac thức chỉ khi nó đang làm việc, không tốn đồng nào, và không cần thiết lập gì cả.
Với cấu hình đóng nắp (closed-lid), công cụ nền tảng miễn phí ở một tầng thấp hơn là sudo pmset disablesleep 1 — nó bảo macOS bỏ qua hoàn toàn chính sách ngủ của mình, kể cả khi đóng nắp. Đây chính là công tắc nền mà mọi app chế độ clamshell, kể cả Closed-Lid mode của chính LidRun, cuối cùng đều gọi tới. Bật nó lên, đóng nắp lại, và Mac vẫn chạy.
Còn có một cách không cần phần mềm gì cả: cắm màn hình ngoài, bàn phím, chuột trong khi Mac đang cắm điện, và hành vi clamshell mặc định của Apple cho phép nó chạy đóng nắp mà không cần thêm phần mềm nào. Nhưng cách này chỉ hoạt động khi có dây nối với màn hình và nguồn điện — chẳng giúp được gì nhiều cho một chiếc laptop làm việc một mình bằng pin ở quán cà phê.
Hướng dẫn liên quanBộ điều tiết an toàn khi giữ Mac thức: vì sao LidRun để một chiếc Mac quá nóng hoặc không hoạt động đi ngủĐiểm mà các công cụ miễn phí hết đường đi
caffeinate không hề biết lệnh nó đang bọc có thực sự bận hay không. Trỏ nó vào một REPL tương tác mà bạn đã rời đi từ lâu, và nó vẫn giữ Mac thức ở mức 0% CPU miễn là shell còn mở, vì nó không bao giờ nhìn vào CPU cả — nó chỉ kiểm tra xem tiến trình còn tồn tại hay không.
pmset disablesleep rủi ro hơn theo một cách cụ thể: nó không gắn với bất cứ thứ gì. Không có gì tự động đưa nó về 0. Bật nó một lần cho một bản build lúc nửa đêm rồi quên mất, và Mac sẽ nằm đó mà thức — nắp đóng, có khi còn nằm trong túi — miễn là cài đặt đó chưa bị tắt. Đây là cách nổi tiếng mà nhiều người sau đó phát hiện ra một chiếc Mac nóng ran và hết pin. Đó chính xác là lý do vì sao Closed-Lid mode của LidRun, dù gọi cùng công tắc pmset đó, luôn ghép cặp 1 với một số 0 tương ứng khi dừng, khi thoát, và cả khi mở lại — thay vì tin rằng ai đó sẽ nhớ.
Cả hai công cụ đều không theo dõi pin hay nhiệt độ. Chúng sẵn sàng giữ Mac thức ở mức pin 2% hay khi quạt đã chạy hết tốc lực, y hệt như khi pin còn 90% và máy mát — vì đơn giản là không có tín hiệu nào cho việc đó được tích hợp sẵn cả. Việc cân đối đánh đổi đó hoàn toàn nằm ở bạn.
Cả hai cũng không nhận biết tiến trình trên toàn phiên làm việc. Chạy Claude Code ở một tab terminal, một dev server ở tab khác, và Docker chạy nền, thì caffeinate chỉ biết đúng một PID mà bạn đã khởi chạy nó cùng — bạn sẽ phải bọc từng lệnh riêng lẻ, và phải nhớ làm điều đó.
Auto Mode đo hoạt động như thế nào
LidRun theo dõi các công cụ theo tên tiến trình hoặc app bundle, và với các trình thông dịch shell — python, node, ruby, perl, bun, deno, java, sh, bash, zsh, php — nó còn đọc cả dòng lệnh, nên một mẫu như train.py vẫn khớp dù tiến trình chạy nó chỉ đơn giản tên là "python". Nhưng phát hiện chỉ mới là một nửa công việc.
CPU là yếu tố quyết định. Với một tiến trình dòng lệnh, ngưỡng mặc định là 20% của một lõi, và có thể chỉnh từ 1% đến 50% trong Cài đặt. Một app GUI phải vượt qua ngưỡng cố định 40% của một lõi bất kể thanh trượt đó được đặt thế nào — một cửa sổ Cursor chỉ đang mở, rảnh rỗi ở mức một chữ số phần trăm, không bao giờ được tính, chỉ tính khi nó thực sự đang compile hay lập chỉ mục. Một tiến trình CLI vừa mới xuất hiện được hưởng lợi thế nghi ngờ có lợi ngay ở lần kiểm tra đầu tiên, vì chưa có chênh lệch CPU nào để so sánh, và LidRun thà không bỏ lỡ thời điểm bắt đầu của một công việc thật; còn app GUI thì không được hưởng đặc ân đó.
Các coding agent đã được biết đến — Claude Code, Codex, agent của Cursor, Windsurf, Aider, Cline, Continue, Goose, OpenHands, Zed, cộng thêm các runtime cục bộ như Ollama, LM Studio, và vLLM — được thêm một lớp nữa một khi chúng đã chứng minh làm việc thật ít nhất một lần: sau đó, chúng được tính là đang hoạt động dựa trên sự hiện diện chứ không phải %CPU, vì một agent đang chờ phản hồi từ model có thể nằm gần 0% CPU mà chưa hề xong việc. Một agent vừa mới khởi chạy, chưa làm gì cả, vẫn phải kiếm được sự tin tưởng đó theo cách thông thường — bằng CPU.
Thời gian giữ (holdoff), với những con số cụ thể
Các tác vụ thực tế thường chạy từng đợt (bursty) — một bản build tạm dừng giữa các giai đoạn, một agent chờ một cuộc gọi mạng, quá trình suy luận (inference) như đang ngừng thở giữa các token. Nhả assertion ra ngay khi CPU sụt xuống, thì Mac có thể ngủ ngay giữa chừng công việc.
Thời gian giữ mặc định là 60 giây, có thể chỉnh từ 10 đến 600 trong Cài đặt: sau lần đo hoạt động cuối cùng, LidRun tiếp tục giữ trong khoảng thời gian đó trước khi kết luận công việc đã thực sự dừng. Một agent đã được biết đến và đã chứng minh làm việc thật thì được hưởng thời gian giữ dài hơn — 30 phút — vì việc gần như đứng yên trong lúc chờ phản hồi API là một phần bình thường của công việc, không phải dấu hiệu đã xong.
Tần suất LidRun kiểm tra là một nút chỉnh riêng, khác với thời gian nó chờ. Khoảng kiểm tra (poll interval) có thể là Fast (5 giây), Balanced (10 giây, mặc định), hoặc Battery saver (30 giây) — hoặc bất kỳ giá trị chính xác nào từ 1 đến 60 giây trong Advanced. Kiểm tra thưa hơn đánh đổi một chút độ nhạy để lấy lại ít CPU nền hơn cho chính nó.
Auto Mode cùng Closed-Lid, và cách xem nó đang theo dõi gì
Auto Mode và Closed-Lid là hai công tắc riêng biệt, không phải hai chế độ cạnh tranh nhau, và chúng chạy song song. Auto Mode quyết định xem một tác vụ có thực sự đang hoạt động hay không; Closed-Lid, một cách riêng biệt, ngăn việc đóng nắp máy ép Mac vào giấc ngủ. Bật Auto Mode lên, rồi đóng nắp máy khi Closed-Lid đang bật, thì cùng một logic CPU-và-holdoff đó vẫn tiếp tục quyết định assertion có được giữ hay không — nó không phải một khóa giữ thức mù quáng chỉ vì màn hình đã tắt.
Để xem nó đang thực sự theo dõi gì, menu thả xuống trên thanh menu bar có một thẻ "Active workloads": mọi tiến trình khớp đều hiện ở đó, những tiến trình đang hoạt động được liệt kê với %CPU theo thời gian thực, những tiến trình rảnh nhưng vẫn trong thời gian giữ được tóm tắt ở bên dưới. Nếu một công cụ bạn kỳ vọng lại không hề xuất hiện, đó là tín hiệu trung thực để đi kiểm tra lại watch-list, chứ không phải để mặc định rằng Auto Mode đang bị hỏng.
Vì sao để Mac ngủ mới chính là mục đích
Một khóa giữ thức luôn bật có chi phí dù có việc đang diễn ra hay không: chạy bằng pin thì nó xả pin, cắm điện thì nó vẫn khiến chip không được nghỉ. Giá trị của Auto Mode nằm ở chỗ nó kết thúc khi công việc kết thúc — và mặc định, nếu không có tiến trình nào được theo dõi hoạt động trong 20 phút, LidRun sẽ chủ động đưa Mac vào giấc ngủ, thay vì chỉ nhả assertion ra rồi chờ bộ đếm giờ rảnh (idle timer) riêng của macOS. Cả khoảng thời gian 20 phút đó lẫn việc có cho ngủ hay không đều có thể chỉnh trong Cài đặt.
Mọi quyết định giữ máy thức đều phải đi qua cùng những ngưỡng an toàn đó, bất kể chế độ nào đang bật. Mặc định, LidRun bắt đầu giảm dần ở mức pin 20%, coi 5% là mức nguy cấp, và buộc nhả assertion ở một ngưỡng cứng quanh 4%, bất kể thứ gì vẫn đang chạy. Auto Mode quyết định khi nào việc giữ thức là hợp lý dựa trên công việc; lớp an toàn quyết định khi nào việc đó không còn an toàn nữa, chấm hết.
Không điều gì trong số này thay thế được sự chăm sóc cơ bản. Đặt ngưỡng CPU và holdoff một lần rồi gần như có thể quên chúng đi — nhưng vẫn phải giữ Mac thông thoáng cho những đợt chạy AI hay dev kéo dài, và coi các ngưỡng pin là một lớp bảo vệ, chứ không phải một thứ thay thế cho việc cắm sạc trong một công việc kéo dài nhiều giờ.
Vị trí của tính năng này, và chi phí của nó
Auto Mode thuộc gói trả phí của LidRun. Keep Awake, Timer, và chế độ Charging-only đều miễn phí, không giới hạn phiên, nhưng tính năng tự phát hiện dựa trên CPU được mô tả trong bài này thuộc gói Pro. Nếu điều duy nhất bạn cần là "giữ thức trong khi đúng một lệnh này chạy", thì caffeinate hoặc chính CLI wrapper lidrun -- <command> của LidRun đã đáp ứng đúng điều đó, miễn phí, dù không có phần tinh chỉnh nào như ở trên.
So với các công cụ menu bar khác: Amphetamine miễn phí và có bộ máy quy tắc sâu nhất trong nhóm — kích hoạt theo app, theo mạng, theo pin — nhưng các quy tắc của nó xoay quanh việc app nào đang chạy, chứ không phải app đó có đang thực sự bận hay không. KeepingYouAwake và Caffeine là những công tắc bật/tắt đơn giản, miễn phí, một chạm, không hề có logic tự nhả nào cả. Lungo là một công tắc hẹn giờ gọn gàng, trả phí. Không cái nào trong năm công cụ đó theo dõi %CPU theo từng tiến trình như Auto Mode làm; đó là một việc hẹp hơn, không phải một lời khẳng định rằng nó vượt trội hơn bất kỳ công cụ nào trong số đó ở đúng việc chúng được sinh ra để làm.
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ó LidRun? Đọc hướng dẫn thiết lập →
Mới biết đến LidRun? Xem bảng giá →
Câu hỏi thường gặp
Bật Auto Mode lên và chọn các công cụ cần theo dõi — LidRun có sẵn một danh sách mặc định bao gồm các AI CLI phổ biến, các runtime model cục bộ, và các công cụ build. Một tiến trình chỉ được tính là đang hoạt động khi mức sử dụng CPU của nó vượt qua ngưỡng (mặc định 20% của một lõi cho tiến trình CLI, cố định 40% cho app GUI), nên một cửa sổ đang mở rảnh rỗi ở chế độ nền sẽ không tự nó giữ phiên làm việc.
Có. Tiến trình dòng lệnh dùng ngưỡng có thể chỉnh trong Cài đặt, mặc định 20% của một lõi và tinh chỉnh được từ 1% đến 50%. App GUI phải vượt qua ngưỡng cố định 40% của một lõi bất kể thanh trượt đó, vì một app chỉ đang mở thường rảnh rỗi ở mức thấp hơn nhiều so với đó.
Không — đó chính là mục đích của holdoff. Sau lần đo hoạt động cuối cùng, LidRun giữ Mac thức thêm 60 giây theo mặc định (chỉnh được từ 10 đến 600) trước khi kết luận công việc đã dừng, nên những khoảng dừng ngắn giữa các giai đoạn build không làm kết thúc phiên. Một AI agent đã được biết đến và đã chứng minh làm việc thật thì được hưởng holdoff dài hơn — 30 phút — vì việc gần như đứng yên trong lúc chờ phản hồi từ model là bình thường, không phải dấu hiệu tác vụ đã xong.
Khi không còn tiến trình nào được theo dõi hoạt động trong suốt cả cửa sổ holdoff, LidRun sẽ nhả assertion giữ thức. Mặc định, nó cũng chủ động đưa Mac vào giấc ngủ sau 20 phút không phát hiện công việc nào, thay vì chỉ để macOS tự quyết định theo bộ đếm rảnh riêng của nó — cả khoảng chờ này lẫn việc có cho ngủ hay không đều chỉnh được. Các giới hạn về pin và nhiệt luôn áp dụng xuyên suốt, ở mọi chế độ.
caffeinate và pmset đều miễn phí và có sẵn trong macOS, nhưng cả hai đều không nhìn vào CPU — caffeinate chỉ kiểm tra xem tiến trình nó bọc còn tồn tại hay không, còn pmset disablesleep là một công tắc bật/tắt thô, không có gì tự động đưa nó về tắt cả. Auto Mode bổ sung lớp mà cả hai đều thiếu: một ngưỡng CPU cho từng tiến trình được theo dõi, một holdoff để những khoảng dừng ngắn không làm kết thúc phiên, và các giới hạn pin/nhiệt có thể ghi đè lên nó bất kể thứ gì đang chạy.
Có — chúng là hai công tắc riêng biệt, không phải hai lựa chọn thay thế nhau. Auto Mode quyết định một tác vụ có đang hoạt động hay không; Closed-Lid, một cách riêng biệt, ngăn việc đóng nắp máy ép Mac vào giấc ngủ. Bật cả hai nghĩa là cùng một logic CPU-và-holdoff đó vẫn điều khiển Mac sau khi nắp đã đóng.
Không — Keep Awake, Timer, và chế độ Charging-only đều miễn phí, không giới hạn phiên, nhưng tính năng phát hiện dựa trên CPU của Auto Mode thuộc gói trả phí của LidRun. Với một lệnh đơn lẻ mà không cần tinh chỉnh gì, CLI wrapper miễn phí lidrun -- <command> hoặc caffeinate có sẵn trong macOS đã đủ đáp ứng trường hợp đó.
Menu thả xuống trên thanh menu bar có một thẻ Active workloads liệt kê mọi tiến trình khớp theo thời gian thực, những tiến trình đang hoạt động hiện %CPU hiện tại, còn những tiến trình rảnh nhưng vẫn trong holdoff được tóm tắt riêng. Nếu một công cụ hoàn toàn không xuất hiện ở đó, hãy kiểm tra xem nó có nằm trong watch-list hay không trước khi cho rằng việc phát hiện đang bị hỏng.