Uzun süren bir terminal komutunda Mac'in uykuya geçmesini önleme

Kısa cevap: komutun başına caffeinate -i your-command ya da lidrun -- your-command yazın; Mac, komut bitene kadar uyanık kalır, başında beklemenize gerek kalmaz. Çoğu rehberin atladığı nokta şu: kapağı kapatmak tamamen farklı bir mekanizmayı devreye sokar — ne caffeinate ne de düz bir keep-awake assertion'ı bunu durdurabilir. Uzun işleri başında olmadan çalıştıranları tam da burada yakalayan şey bu.
Uzun komutlar neden yarıda kesiliyor
Terminal'deki bir komut, Mac'in güç durumuna bağlı sıradan bir process'tir. Boşta kalma zamanlayıcısını tetikleyecek kadar uzun süre uzaklaşırsanız ya da kapağı kapatırsanız, Mac uykuya geçer ve komut tam ortasında askıda kalır.
Uzun rsync aktarımları, build'ler, model indirmeleri ve batch script'ler boşta kalma zamanlayıcısını en çok aşan işlerdir — üstelik yeniden çalıştırmak en çok bunlarda can sıkar. İş başarısız olmadı; Mac işin altından çekildi.
Baştan belirtmekte fayda var, bununla bağlantılı ikinci bir arıza modu daha var: işi uzaktan çalıştırmak için bir Mac'e SSH ile bağlandıysanız, o makinenin kendi boşta kalma ve kapak-kapatma uyku zamanlayıcıları vardır ve bunlar SSH bağlantınızdan tamamen bağımsızdır. Keep-awake aracı, işi yapan makinede çalışmalı — yazdığınız makinede değil.
caffeinate ve flag'leri
macOS tam olarak bunun için caffeinate'i hazır getirir; tek bir foreground iş için doğru araç budur — kurulum yok, ücret yok. Hangi flag kombinasyonunu kullandığınız, aslında neyi açık tuttuğunu belirler:


caffeinate -i your-command — your-command çalıştığı sürece boşta kalma uykusunu engeller, komut bitince otomatik olarak çıkar ve serbest bırakır. Çoğu kişinin bir terminal işi için aradığı şey budur.
caffeinate -d your-command — ekranı da uyanık tutar; kayan çıktıya göz atmak isteyip ekranın kararmasını istemiyorsanız işe yarar.
caffeinate -s your-command — sistem uykusunu engeller, ama yalnızca Mac elektriğe bağlıyken. Pilde -s sessizce hiçbir şey yapmaz; fişten çekildiğinde de aynı davranacağını varsayan pek çok kişiyi bu şaşırtır.
caffeinate -w <pid> — aslında bir komutu sarmalamaz; zaten çalışmakta olan bir process'i bekler. Arka planda başlattığınız bir iş için kullanışlıdır: long_job & caffeinate -w $!.
caffeinate -t 3600 — assertion'ı bir process'e bağlamak yerine sabit bir saniye sayısı boyunca tutar; belirli bir komuttan çok zamanlanmış bir pencere için kullanışlıdır.
İlgili kılavuzDocker build sırasında Mac'in uykuya geçmesini önleyincaffeinate'in bittiği yer ve kapağın ayrı bir sorun olduğu yer
caffeinate'in yapmadığı şey, bataryayı ya da ısıyı izlemektir. Bu flag'lerin hepsi, başında olmadığınız bir işte şarj tükenene kadar laptop'u seve seve uyanık tutar; hiçbiri uzun ve sıcak bir compile sırasında Mac'in termal durumunu okumaz.


Kapak meselesi ise tamamen ayrı bir konu. caffeinate'in assertion'ları ve LidRun'ın kendi CLI'ının kullandığı aynı IOPMAssertionCreateWithName çağrısı, yalnızca *idle* (boşta kalma) uykusunu engeller. Kapağı kapatmak, hiçbir idle-sleep assertion'ının durduramayacağı ayrı ve daha alt seviyeli bir clamshell uykusunu tetikler — işletim sistemi makineyi ne olursa olsun uyutur. Kapağı kapalı bir Mac'i pilde uyanık tutan tek genel-kullanıma-açık yol, admin yetkisi gerektiren global bir sistem ayarı olan pmset -a disablesleep 1'dir; harici bir ekran bağlıyken ve aktifken macOS zaten native clamshell modu üzerinden uyanık kalır, üçüncü parti bir araca gerek yoktur. Gerçek senaryonuz masanızda beklemek değil de kapağı kapatmaksa, kapak-kapalı rehberimiz bu mekanizmayı ve getirdiği ödünleri baştan sona anlatıyor — bu yazı ise terminal-komutu senaryosuna odaklanmaya devam ediyor.
SSH üzerinden uzun işler çalıştırmak
Komut uzak bir Mac'te çalışıyorsa, önemli olan iki ayrı saat vardır ve bunlar birbirinden bağımsızdır. Biri Mac'in kendi idle-sleep zamanlayıcısı; diğeri ise SSH oturumunuzun bir ağ kesintisine ya da yerel terminalinizin kapanmasına dayanıp dayanamayacağı.
Birincisi için caffeinate -i veya lidrun --'ı yerel makinenizde değil, uzak Mac'in kendisinde çalıştırın — bir keep-awake assertion'ı yalnızca üzerinde çalıştığı makineyi korur.
İkincisi için bağlantıyı kesmeden önce uzak komutu nohup, screen ya da tmux ile sarmalayın. Bunlardan biri olmadan, yerel terminalinizi kapatmak (ya da bağlantıyı kaybetmek) uzak shell'e SIGHUP gönderebilir ve Mac hiç uyumamış olsa bile işi öldürebilir.
Bir komutu sarmalamanın daha güvenli yolu
LidRun'ın CLI'ı aynı tek-komut kalıbını alır ve caffeinate'in atladığı korumaları ekler: lidrun -- your-command, o tek çalıştırma için kısa ömürlü bir keep-awake assertion'ı tutar ve komut biter bitmez serbest bırakır — lisans ya da kurulum gerekmez; caffeinate gibi ücretsiz ve sınırsızdır.
Bu assertion aktifken, LidRun çalışıyorsa uygulamanın batarya tabanı ve termal otomatik-serbest-bırakma kuralları da geçerliliğini korur: keep-awake, sizin belirlediğiniz bir batarya eşiğinde (varsayılan %20, %15-50 arası ayarlanabilir) otomatik durur; ayrıca ayarınız ne olursa olsun her zaman devreye giren, sabit bir %4 acil-durum tabanı vardır — çünkü macOS'un temiz bir şekilde uykuya geçebilmesi için o kadar boşluğa ihtiyacı vardır. Mac'in termal durumu kritiğe ulaşırsa, tutma varsayılan olarak kendiliğinden de serbest bırakılır — LidRun'ın dürüst sözü şudur: agent ya da iş çalışıyorsa uyanık kal; iş bittiyse ya da Mac güvensiz durumdaysa serbest bırak ve uyumasına izin ver.
Uygulamanın içinde bunun bir GUI versiyonu da var — bir komutu başlatan, Mac'i o komut için uyanık tutan ve Terminal'e hiç dokunmadan canlı çıktı gösteren bir Run & Watch paneli — ama bu panel bir Pro özelliği. Düz lidrun -- <command> CLI sarmalayıcısı ise hiçbir şekilde kısıtlı değil; LidRun'ın ücretsiz katmanının bir parçası.
Pratik bir kurulum
Tek seferlik komut, masanızdayken: başına ekleyip uzaklaşın — lidrun -- your-long-command da caffeinate -i your-long-command da işe yarar, assertion komut biter bitmez serbest kalır. İkisi de başka bir kuruluma ihtiyaç duymaz.
Daha uzun, başında olmadığınız bir oturum, kapak yine açıkken: mümkünse fişe takın, komutu başlatın; LidRun'ın batarya/termal korumalarının tek bir process yerine tüm oturumu izlemesini istiyorsanız önce menü çubuğundaki Keep Awake anahtarını açın, ardından komutunuzu normal şekilde çalıştırın. Takılıp kalan bir script'in Mac'i sonsuza kadar uyanık tutmaması için bir oturum zamanlayıcısı ayarlayın (seçici 30 dakikadan 8 saate kadar seçenek sunar) — takılıp kalmış bir iş, başında olmadan çalışan bir keep-awake'in sonsuza kadar sürmemesi gereken tam da o durumdur.
Kapak-kapalı oturum: bu, düz bir keep-awake değil, özellikle Closed-Lid modunu gerektirir — yukarıda bağlantısı verilen özel rehbere bakın, çünkü güvenlik denklemi değişir (kapak kapalıyken ısının gidecek yeri yoktur).
Kurulum ne olursa olsun, ağır işler için Mac'i sert ve havalandırmalı bir yüzeyde tutun. Uzun bir build, sıkıştırma ya da aktarım ısınabilir; hava akımı ise hiçbir yazılım ayarının çözemeyeceği tek şeydir.
LidRun, işinizi kapak kapalıyken, pil ve sıcaklık koruması yerleşik biçimde çalışır tutar.
LidRun zaten sizde mi? Kurulum rehberini okuyun →
LidRun'u yeni mi tanıdınız? Fiyatlara bakın →
Sık sorulanlar
Fişe takılı bir Mac'te ara sıra kontrol edeceğiniz bir iş için evet — caffeinate -i your-command güvenilir ve ücretsizdir. Uzun, başında olmadığınız bir iş için, özellikle pilde, batarya ya da termal farkındalığı olmadığından Mac'i düşük-batarya kapanmasının ya da sıcaktan kısılan bir işin ortasında bile uyanık tutmaya devam eder.
-i, sarmalanan komut için boşta kalma uykusunu engeller (çoğu terminal işinin ihtiyaç duyduğu budur), -d ekranı da açık tutar, -s sistem uykusunu engeller ama yalnızca elektriğe bağlıyken (pilde hiçbir şey yapmaz) ve -w <pid> yeni bir komutu sarmalamak yerine zaten çalışmakta olan bir process'i bekler.
Evet. Hem caffeinate -i your-command hem de lidrun -- your-command, o tek process süresince bir idle-sleep assertion'ı tutar ve komut bitince otomatik olarak serbest bırakır. lidrun CLI sarmalayıcısı ücretsiz ve sınırsızdır, lisans gerekmez.
caffeinate ve düz bir keep-awake assertion'ı yalnızca boşta kalma uykusunu engeller. Kapağı kapatmak, idle-sleep assertion'larının durduramayacağı ayrı bir clamshell uykusunu tetikler — Mac'in kapak kapalıyken uyanık kalabilmesi için ya aktif bir harici ekrana ya da admin yetkisi gerektiren pmset -a disablesleep 1 ayarına (LidRun'ın Closed-Lid modunun kullandığı ayar) ihtiyacı vardır.
LidRun'ın Keep Awake modunu bir oturum zamanlayıcısıyla kullanıyorsanız, zamanlayıcı çalışma süresine bir üst sınır koyar — 30 dakikadan 8 saate kadar — böylece takılıp kalan bir komut Mac'i sonsuza kadar uyanık tutmaz. Düz bir caffeinate -i sarmalaması böyle bir sınır tanımaz; process bitene ya da siz kendiniz sonlandırana kadar tutar.
Keep-awake aracının, yerel makinenizde değil işi yapan Mac'in kendisinde çalışması gerekir — SSH, o Mac'in kendi uyku zamanlayıcılarını değiştirmez. Ayrıca, kopan bir bağlantı ya da kapanan yerel terminal SIGHUP göndererek uzak Mac uyanık kalmış olsa bile işi öldürmesin diye uzak komutu nohup, screen ya da tmux ile sarmalayın.