Quy trình làm việc đóng nắp MacBook cho developer

Quy trình làm việc đóng nắp MacBook là một cách thiết lập để việc gập nắp MacBook lại không giết chết công việc bạn vừa khởi động — Mac tiếp tục chạy thay vì ngủ ngay khi màn hình tắt. Sở dĩ chuyện này trở thành vấn đề bây giờ là vì các AI coding agent: một lượt refactor của Claude Code, một tác vụ re-index nền của Cursor, hay một job Codex CLI chạy không người giám sát có thể mất cả tiếng đồng hồ, trong khi mặc định macOS sẽ dừng tất cả ngay khi bạn đóng nắp máy. Có những cách miễn phí, có sẵn trong hệ thống để ngăn điều đó — caffeinate, pmset -a disablesleep, hoặc cắm thêm màn hình ngoài — và mỗi cách đều có một giới hạn thực sự đáng biết trước khi bạn đóng nắp máy rồi bỏ đi. Bài này đi qua từng lựa chọn, chỉ ra chỗ chúng hết tác dụng, và quy trình mà LidRun xây dựng dựa trên chính những công cụ hệ thống đó: phát hiện agent đang chạy, giữ Mac thức, rồi tự buông khi pin hoặc nhiệt độ báo dừng.
Vì sao nắp máy là trở ngại
Đóng nắp MacBook khi chạy bằng pin sẽ kích hoạt clamshell sleep — một kiểu ngủ khác, ở tầng thấp hơn so với idle sleep mà macOS dùng khi bạn chỉ đơn giản là ngừng chạm bàn phím. Chính sự khác biệt này là lý do khiến việc khắc phục trở nên phiền toái.
macOS không biết rằng một AI agent đang làm dở việc. Một phiên Claude Code đang refactor một file lớn, một background agent của Cursor đang re-index cả repo, một job Codex CLI chạy không ai canh — với kernel, tất cả chỉ là những process bình thường. Nắp máy vừa khép lại, mọi thứ lập tức bị treo, thường chỉ vài giây sau khi bạn đã quay lưng bỏ đi và không còn để mắt tới nữa.
Đây cũng là lý do vì sao cách sửa hiển nhiên nhất lại không ăn thua. Chạy caffeinate trong terminal, hay bật một toggle keep-awake trong app menu-bar, chỉ giữ cái mà macOS gọi là idle-sleep assertion — cùng một cơ chế nền mà caffeinate -i và phần lớn các tiện ích keep-awake dùng. Assertion đó ngăn Mac ngủ vì lý do bạn không chạm bàn phím. Nó không làm gì được với clamshell sleep, thứ được kích hoạt riêng vì nắp máy đã đóng vật lý. Khi chạy pin và không cắm màn hình ngoài, việc đóng nắp vẫn thắng bất kỳ idle-sleep assertion nào.
Những cách miễn phí, có sẵn mà developer đã dùng
Thực ra chỉ có hai cách giải quyết được chuyện này, và cả hai đều có sẵn trong macOS — không cần cài thêm app của bên thứ ba.
Màn hình ngoài, kèm nguồn điện AC. Cắm một màn hình ngoài trong lúc máy đang cắm điện rồi đóng nắp lại: chế độ clamshell-mode có sẵn của macOS sẽ giữ máy chạy đầy đủ, không cần cấu hình gì thêm. Đây là cách thiết lập tiêu chuẩn để biến MacBook thành một chiếc desktop mini, và nó thực sự miễn phí. Vấn đề là nó trói việc giữ máy thức khi đóng nắp vào một cái màn hình và một ổ cắm — nó không giúp được gì nếu bạn muốn đóng nắp, rút điện, rồi ôm máy đi.
pmset -a disablesleep 1. Đây mới là đòn bẩy thực sự ngăn máy ngủ khi đóng nắp mà không cần màn hình ngoài — một tùy chọn hệ thống ở cấp root, có tài liệu chính thức, không phải một mẹo lách. Chạy nó từ Terminal bằng sudo pmset -a disablesleep 1, và Mac sẽ không ngủ khi đóng nắp, dù chạy pin hay cắm điện, cho tới khi có gì đó đặt lại nó về 0. Đây cũng chính là cơ chế nền mà chế độ Closed-Lid của LidRun gọi tới — khác biệt nằm ở những gì được bọc quanh lệnh gốc đó, sẽ nói ở phần dưới.
caffeinate -s (hoặc -d, -i) vẫn có chỗ đứng riêng trong bộ công cụ — cho một script có giới hạn thời gian hay một bước CI, nơi nắp máy vẫn mở và bạn chỉ cần giữ màn hình hoặc hệ thống thức trong một khoảng thời gian biết trước. Nhưng một khi nắp máy thực sự sắp đóng lại, đây không còn là công cụ đúng nữa.
Chỗ các cách miễn phí hết tác dụng
disablesleep thô một cách đáng để ý một khi nắp máy đã đóng và bạn đã rời khỏi phòng. Đây là một cài đặt toàn cục, tồn tại dai dẳng — nó không giới hạn trong phiên terminal của bạn hay một process cụ thể nào, mà là một cờ áp dụng cho toàn máy, cứ bật cho tới khi có gì đó tắt nó đi một cách tường minh. Đóng terminal, quên mất nó, hay để cái tiến trình đã bật nó bị crash — nó cũng không tự trả lại trạng thái cũ. Mac sẽ không ngủ cho tới khi bạn tự chạy lệnh đặt về 0 hoặc khởi động lại máy.
Trong thực tế, điều này dẫn tới hai kiểu sự cố: một chiếc laptop bị bỏ quên, nóng lên trong một cái túi đóng kín, quạt trong máy quay mà chẳng giúp được gì vì không có luồng khí để di chuyển; và một chiếc laptop cạn pin về 0% vì không có gì theo dõi mức pin cả — disablesleep không nói gì về mức năng lượng, nên Mac cứ chạy tiếp cho tới khi tắt cứng thay vì ngủ một cách sạch sẽ.
Cách dùng màn hình ngoài né được cả hai vấn đề đó — vì Mac có đi đâu đâu — nhưng nó chỉ bao được trường hợp giữ máy thức khi đóng nắp tại bàn làm việc, đang cắm điện. Nó không đáp ứng được điều mà phần lớn developer thực sự muốn: đóng nắp, bỏ Mac vào túi, và để một job chạy nền hoặc tự hoàn tất an toàn, hoặc tự dừng lại trước khi gây ra chuyện gì rủi ro.
Một quy trình đóng nắp máy yên tâm hơn
Chế độ Closed-Lid của LidRun gọi đúng cùng một cài đặt pmset -a disablesleep đã nói ở trên — không hề có một API bí mật nào khác trên macOS cho việc này. Cái thay đổi là những gì được bọc quanh lệnh gọi đó: một helper có quyền cao mà bạn chỉ cần cấp phép một lần (sau đó, bật/tắt Closed-Lid không còn hỏi mật khẩu nữa — nếu không có helper này, macOS sẽ hỏi mỗi lần), tự động trả lại trạng thái cũ khi bạn tắt chế độ hoặc thoát app, và một bước kiểm tra phục hồi sau crash ở lần mở tiếp theo. Nếu LidRun bị crash trong lúc Closed-Lid đang bật, một file trạng thái nhỏ kèm heartbeat sẽ giúp lần mở app kế tiếp phát hiện disablesleep=1 còn sót lại và đặt lại nó — đây là một cách khắc phục cố gắng hết sức khi mở lại app, không phải một watchdog chạy nền liên tục, nên một crash giữa phiên làm việc vẫn có thể để cài đặt đó bị kẹt cho tới khi bạn mở LidRun lại.




Phía trên nền tảng đó là Auto Mode, được thiết kế để phát hiện công việc thực sự đang diễn ra thay vì bắt bạn phải ngồi canh một cái toggle. Mặc định nó theo dõi Claude Code, Cursor, và Codex CLI, cùng với một danh sách dài hơn — aider, Gemini CLI, Goose, opencode, amp, Cline, Copilot, Windsurf, Ollama, và các công cụ build phổ biến như Docker, cargo, node — và chỉ giữ Mac thức khi một trong số đó thực sự đang làm việc gì đó; một cửa sổ Cursor chỉ đang mở mà CPU ở mức 0% thì không tính. Vì các agent thường im lặng một lúc trong lúc chờ phản hồi từ một API call, một agent đã biết sẽ được cho một khoảng chờ 30 phút trước khi khoảng lặng đó được tính là đã xong việc, và LidRun còn đợi thêm 3 phút không có gì chạy nữa trước khi thực sự tuyên bố tác vụ đã hoàn tất — đủ dài để sống sót qua một quãng nghỉ suy nghĩ bình thường, nhưng đủ ngắn để không thức suốt đêm một cách vô ích.
Bên dưới cả hai chế độ, cùng một tầng an toàn luôn chạy bất kể thế nào: cảnh báo pin yếu mặc định ở mức 15%, tự động buông giữ-thức ở khoảng 5%, và một ngưỡng ép ngủ cứng (4–8%, tùy cài đặt của bạn) để Mac tự cho phép mình ngủ thay vì chạy tới 0% rồi tắt cứng. Về nhiệt độ, LidRun theo dõi tín hiệu áp lực nhiệt của hệ thống — cùng chuỗi Normal / Fair / Hot / Very Hot mà bạn thấy trong app — cộng thêm một phép kiểm tra nhiệt độ số và mức throttle bên dưới; ở tầng Very Hot, chế độ Closed-Lid sẽ tự tắt để phần cứng có thể throttle và, nếu cần, đi ngủ. Không điều gì trong số này thay đổi được vật lý — đóng nắp máy là mất đi đường thoát nhiệt chính, và một chiếc Mac đang nóng nhét trong một cái túi kín vẫn là một ý tưởng tệ — nhưng nó có nghĩa là Mac tự lùi bước thay vì cứ chạy tới khi có gì đó hỏng.
Thiết lập
Cấp phép cho helper có quyền cao một lần duy nhất, ngay lần đầu LidRun hỏi. Đó chỉ là một lần nhập mật khẩu admin; sau đó, Closed-Lid sẽ không còn hỏi mỗi lần bạn dùng nữa.


Bật Auto Mode và kiểm tra xem nó đang theo dõi những công cụ nào. Claude Code, Cursor, và Codex CLI được bật mặc định cùng với các công cụ build và các local LLM runtime — thêm hoặc bớt pattern nếu stack của bạn khác.
Khởi động tác vụ — chạy Claude Code, kích hoạt re-index của Cursor, hay chạy job Codex.
Bật chế độ Closed-Lid. Hộp thoại xác nhận sẽ hỏi hai điều: giữ trong bao lâu — cho tới khi bạn tự tắt, hoặc một khoảng thời gian cố định từ 30 phút tới 8 tiếng — và chọn giữa Smart hay Keep-awake. Smart, chế độ mặc định, cho phép Mac ngủ khi không có gì được theo dõi chạy trong 10 phút; Keep-awake giữ Mac thức cho tới khi chính bạn dừng nó.
Đóng nắp máy lại.
Có hai thói quen quan trọng hơn bất kỳ cài đặt nào: đặt máy trên một mặt phẳng cứng, thoáng khí, và cắm điện lưới cho bất cứ thứ gì sẽ chạy hàng giờ. Chúng cho các lớp bảo vệ phần mềm một điểm tựa, thay vì để phần mềm là thứ duy nhất đứng giữa một chiếc nắp máy đóng kín và một sự cố.
Keep Awake, Timer, và Charging-only miễn phí ở mọi gói, không cần dùng thử, không giới hạn số phiên. Khả năng phát hiện agent của Auto Mode và chế độ Closed-Lid nằm trong Pro; Closed-Lid cho một bản cài chưa có license một số lượt chạy miễn phí giới hạn để dùng thử trước khi quyết định. Ngưỡng ép ngủ theo pin và tự tắt theo nhiệt độ áp dụng trong mọi trường hợp — LidRun không giữ lại tính năng dừng khi pin yếu cơ bản cho riêng gói trả phí.
Dành cho ai
Việc thiết lập này đáng làm nếu bạn thường xuyên khởi động những job chạy dài và muốn di chuyển trong lúc chúng chạy — từ bàn làm việc ra ghế sofa, từ nhà ra quán cà phê, hay một job bạn bắt đầu vào buổi tối và kiểm tra lại vào sáng hôm sau.
Nó hữu ích nhất cho công việc với AI agent nói riêng: một lượt chạy Claude Code trước khi đi ngủ, một lượt re-index của Cursor trong lúc bạn nấu bữa tối, một tác vụ Codex mất cả tiếng đồng hồ. Trước khi có quy trình đóng nắp này, đóng nắp máy trong lúc một trong số đó đang chạy đồng nghĩa với việc đánh cược xem nó có sống sót hay không.
Nếu bạn chủ yếu làm những việc ngắn, tương tác trực tiếp tại một bàn làm việc cố định, thì bỏ qua cái này đi — một màn hình ngoài lo được việc đó với ít công thiết lập hơn, và chẳng có lý do gì để cấp phép cho một helper quyền cao chỉ vì một tác vụ năm phút. Còn nếu cái nắp máy là lý do duy nhất khiến bạn vẫn phải ngồi đó canh một job đáng lẽ có thể tự chạy, thì một quy trình làm việc khi đóng nắp máy đáng để thử một lần.
So với các cách khác
Không có công cụ nào dưới đây tệ cả — chúng chỉ được xây cho một mục đích khác với việc giữ một coding agent không người canh sống sót sau một chiếc nắp máy đóng kín, trong khi vẫn trung thực về pin và nhiệt độ.


caffeinate là lựa chọn đúng cho script và CI: một lệnh có giới hạn, nắp máy mở, không cần GUI. Nó không sống sót qua một lần đóng nắp khi chạy pin, và nó không có khái niệm gì về AI agent cả.
pmset -a disablesleep là cơ chế thật sự đứng sau mọi cách lách để giữ máy thức khi đóng nắp, kể cả LidRun — xem lại phần trên để biết cái giá phải trả khi dùng thẳng dòng lệnh nếu có gì đó trục trặc.
Amphetamine, KeepingYouAwake, Lungo, và Caffeine đều là những tiện ích keep-awake được làm tốt, phổ biến, với trigger linh hoạt và giao diện menu-bar gọn gàng. Để ngăn Mac ngủ trong lúc bạn đang dùng nó, đây là những lựa chọn chắc chắn và thường miễn phí. Nhưng thứ chúng không được xây riêng cho là một chiếc nắp máy đóng kín hay một AI coding agent — chúng vẫn giữ cùng một idle-sleep assertion đã nói ở trên, nên khoảng trống clamshell-sleep vẫn còn nguyên, và không cái nào trong số đó phát hiện được Claude Code, Cursor, hay Codex, hay tự buông khi pin hoặc nhiệt độ báo dừng. (Để xem kỹ hơn về một trong số đó, xem so sánh với Amphetamine.)
Ngách của LidRun hẹp hơn một cách có chủ đích: nhận biết được agent, giữ được máy thức khi đóng nắp, và được xây để tự buông tay thay vì mặc định rằng lúc nào thức cũng là câu trả lời đúng. Agent còn chạy, thì giữ máy thức. Agent xong việc hoặc không còn an toàn, thì buông ra và để Mac ngủ.
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
Mặc định, Auto Mode theo dõi Claude Code, Cursor, và Codex CLI, cộng với một danh sách tích hợp sẵn dài hơn — aider, Gemini CLI, Goose, opencode, amp, Cline, Copilot, Windsurf, và Ollama, cùng các công cụ build như Docker, cargo, và node. Bạn có thể thêm hoặc bớt pattern để khớp với stack riêng của mình. Một công cụ được theo dõi chỉ giữ Mac thức khi nó thực sự đang hoạt động — một cửa sổ đang mở nhưng idle thì không tính.
Keep Awake (cùng với Timer, và Charging-only) giữ một idle-sleep assertion — kiểu mà caffeinate -i dùng — và như vậy là đủ miễn là nắp máy vẫn mở. Chế độ Closed-Lid là một cơ chế khác: nó đặt pmset -a disablesleep, đòn bẩy công khai duy nhất ngăn được kiểu ngủ do nắp máy đóng vật lý khi chạy pin. Bạn cần dùng đúng Closed-Lid cho một lượt chạy khi đóng nắp — chỉ Keep Awake thôi thì không sống sót nổi.
Mặc định LidRun cảnh báo ở mức 15%, tự buông giữ-thức ở khoảng 5%, và để Mac ngủ ở một ngưỡng cứng trong khoảng 4–8% thay vì để pin cạn về 0% rồi tắt cứng. Các ngưỡng này có thể tùy chỉnh trên Pro; còn bản thân ngưỡng an toàn đó không bị gỡ bỏ ở gói miễn phí.
LidRun theo dõi liên tục trạng thái nhiệt qua các tầng Normal, Fair, Hot, và Very Hot, kết hợp tín hiệu áp lực nhiệt của hệ thống với một phép kiểm tra nhiệt độ số và mức throttle. Ở tầng cao nhất, chế độ Closed-Lid sẽ tự tắt để phần cứng có thể throttle và ngủ nếu cần. Đây là một lớp bảo vệ dự phòng, không phải thứ thay thế cho luồng khí — hãy đặt Mac trên một mặt phẳng cứng, thoáng khí cho những lượt chạy dài.
Không. Bạn chỉ cần cấp phép cho helper quyền cao và chọn các ngưỡng một lần duy nhất. Sau đó, bước lặp lại chỉ là khởi động tác vụ, bật Closed-Lid, rồi đóng nắp máy lại.
Có thể an toàn, khi các ngưỡng pin và nhiệt độ đóng vai trò lớp bảo vệ và Mac được cắm điện, đặt trên một mặt phẳng thoáng khí — nhưng đóng nắp máy luôn đồng nghĩa với việc mất đi đường thoát nhiệt chính, nên hãy xem các ngưỡng này là một lớp dự phòng, chứ không phải lý do để ngừng để ý xem Mac đang chạy ở đâu.