Użyj kofeiny, aby zapobiec zasypianiu na zamkniętej pokrywie baterii

41

Natywne caffeinatenarzędzie nie działa, aby zapobiec uśpieniu mojego MacBooka po zamknięciu wyświetlacza. Zamiast tego system śpi, a różne usługi sieciowe (VPN, udostępnianie ekranu, połączenia VOIP, klienci wiadomości, przesyłanie plików) nie działają, gdy idę od biurka do spotkania w <5 minut.

Spacerowanie z półotwartą pokrywą laptopa utrudnia bezpieczne noszenie kawy i jest wyraźnie chłodne.

Natywne caffeinatenarzędzie jest zaprojektowane do obsługi tego jako przyjazny dla użytkownika zamiennik pmset, ale wydaje się, że nie działa po odłączeniu od zasilania sieciowego.

Dokumenty za pośrednictwem man caffeinate

-s Utwórz asercję, aby zapobiec uśpieniu systemu. To twierdzenie jest ważne tylko wtedy, gdy system jest zasilany prądem przemiennym .

Szukasz natywnej alternatywy dla InsomniaX lub nosleep .

Funkcja limitu czasu jest niezbędna, aby uniknąć przypadkowego upchnięcia mojego nieumarłego macbooka do torby, co powoduje gorący bałagan. ( caffeinate -t, określa limit czasu w sekundach)

tutaj
źródło
Obawiam się, że nie ma natywnej alternatywy, ponieważ MacBook powinien iść spać po zamknięciu. : - /
Asmus
2
Chodzenie z MacBookiem jest właśnie tym, dlaczego chcę również rozwiązanie zapobiegające zasypianiu, gdy pokrywa jest zamknięta.
theonlygusti
Próbowałeś opcji -t, jak caffeinate -t 3600? Z mojego doświadczenia wynika, że ​​działa nawet wtedy, gdy Macbook działa na baterii.
Qiang Xu
Dzięki za sugestie, nie działał przy pierwszych próbach. Czy coś brakuje? Testowane 1) caffeinate -t 36002) Zamknij laptopa 3) Poczekaj 5s 4) Otwórz laptopa, aby znaleźć ekran logowania i odłączone usługi sieciowe.
tutaj
@tutaj nie próbowałem jednak zamykać pokrywy. Właśnie uruchomiłem polecenie z -topcją, gdy mój MacBook jest na baterii i nie poszedł spać. Nie próbowałem z zamkniętą pokrywą, ale wygląda na to, że Macbook będzie zmuszony spać, gdy tylko zamkniesz pokrywę. Przepraszam za to że nie zrozumiałem. Myślałem, że szukasz sposobu, aby działał, gdy działa tylko na baterii, bez zamkniętej pokrywy.
Qiang Xu

Odpowiedzi:

37

To nie jest idealne, ale oto rozwiązanie. Aby zapobiec zasypianiu laptopa, gdy pokrywa jest zamknięta i pracujesz na baterii, uruchom następujące polecenia:

sudo pmset -b sleep 0; sudo pmset -b disablesleep 1

Aby ponownie włączyć tryb uśpienia laptopa, gdy pokrywa jest zamknięta i pracujesz na baterii, uruchom następujące polecenia:

sudo pmset -b sleep 5; sudo pmset -b disablesleep 0

„5” w drugim zestawie poleceń reprezentuje liczbę minut przed snem na baterii; dostosuj odpowiednio do swojego laptopa.

Jest to trochę niebezpieczne, ponieważ jeśli zapomnisz ponownie włączyć ustawienia, laptop nigdy nie będzie spał na baterii. Z tego powodu napisałem skrypt powłoki, aby automatycznie ponownie włączyć ustawienia:

#!/bin/bash
#***************************************************************************
#*** noz - prevent laptop from sleeping when lid is closed
#***************************************************************************

#***** set some defaults *****
BATTERY_SLEEP=5 # in minutes
DEF_WAKE_LEN=300 # in seconds

#***** determine timeout value *****
timeout_len=${1:-$DEF_WAKE_LEN}

function prevent_sleep() {
    echo
    echo -n "Preventing sleep for $timeout_len seconds; press <enter> to continue..."

    sudo pmset -b disablesleep 1
    sudo pmset -b sleep 0
}

function enable_sleep() {
    # $1: <enter> = 0, timeout = 1, Ctrl-C = undef

    #----- insert a newline for timeout or Ctrl-C -----
    if [[ ${1:-1} -eq 1 ]]; then    echo; fi
    echo "Restoring previous battery sleep setting: $BATTERY_SLEEP"

    sudo pmset -b disablesleep 0
    sudo pmset -b sleep $BATTERY_SLEEP

    #----- sleep on timeout only -----
    if [[ ${1:--1} -eq 1 ]]; then   sudo pmset sleepnow; fi
    exit
}

#***** prevent it from sleeping *****
prevent_sleep

#***** trap Ctrl-C *****
trap enable_sleep INT

#***** wait for an enter *****
read -t $timeout_len
rc=$?

#***** re-enable normal sleep *****
enable_sleep $rc

Skrypt powłoki wyłączy tryb uśpienia, dopóki nie naciśniesz Enterklawisza, w którym to momencie ponownie włączy ustawienia uśpienia (alternatywnie możesz nacisnąć Ctrl- Ci osiągnąć to samo). Ustawi także limit czasu (domyślnie 300 sekund / 5 minut), po którym ustawienia uśpienia zostaną automatycznie ponownie włączone, a laptop zostanie zmuszony do przejścia w tryb uśpienia. Chociaż byłoby to uciążliwe, jeśli używasz laptopa na spotkaniu, uratuje życie, jeśli zapomnisz i włożysz laptopa do torby, aby wrócić do domu.

Bystrzy czytelnicy zauważą, że te polecenia wymagają sudo; niestety to nieuniknione AFAIK. To, co zrobiłem w moim systemie, polega na tym, aby nie musiałem wpisywać hasła, aby uruchomić się pmsetjako root. Aby to zrobić, edytuj sudoersplik ( sudo visudo) i dodaj ten wiersz:

joe ALL=(ALL) NOPASSWD: /usr/bin/pmset

zastępując „joe” twoją nazwą użytkownika. Prawdopodobnie mógłbyś osiągnąć ten sam wynik (tj. Uruchomić skrypt bez konieczności wprowadzania hasła), uruchamiając skrypt powłoki SETUID, ale nie lubię tego; otwarcie tego jednego polecenia przez sudoers wydaje mi się mniej ryzykowne.

Aby uruchomić skrypt, umieść go w katalogu na swoim PATHi wywołaj jako:

noz [<timeout in seconds>]

Gdy dotrzesz do celu, po prostu naciśnij Enterlub Ctrl- Ci możesz już iść. A jeśli o tym zapomnisz, automatycznie zresetuje się i przejdzie w tryb uśpienia.

Prawdopodobnie istnieje sposób, aby to wszystko osiągnąć za pomocą AppleScript, dzięki czemu można następnie przypisać mu skrót klawiszowy, a co nie; Spróbuję tego, jeśli będę zmęczony uruchamianiem tego z wiersza poleceń.

Joe Casadonte
źródło
6
Fajne! Wielkie dzięki! Sugestia / uproszczenie: nie sądzę, że musisz zmienić sleepustawienie. Wystarczy włączyć disablesleepi wyłączyć. pmset -a disablesleep 1i pmset -a disablesleep 0działa dobrze dla mnie. Mój MacBook nie zasypia, kiedy zamykam pokrywę. Wszystkie pozostałe ustawienia pozostają takie same.
jcsahnwaldt
Użytkownik Github iccir stworzył bezpłatną aplikację o nazwie Fermata, która wykorzystuje tę sztuczkę pod maską i ładnie otacza ją ikoną paska menu i minutnikiem itp. Właśnie wypróbowałem ją na Mojeve (10.14.2) i działała świetnie dla mnie. github.com/iccir/Fermata
Alex Ryan
5

Iccir, użytkownik Github, stworzył bardzo przydatną małą darmową aplikację paska menu o nazwie Fermata, która robi dokładnie to, co chcesz: utrzymuje MacBooka w stanie czuwania przy zamkniętej pokrywie i pozwala ustawić czas oczekiwania.

Właśnie wypróbowałem to na Mojave (10.14.2) i działało to dla mnie świetnie. https://github.com/iccir/Fermata

Alex Ryan
źródło
5

Nie ma natywnego sposobu na zrobienie tego. Oto, co otrzymałem po kilku poszukiwaniach i próbach:

wprowadź opis zdjęcia tutaj

Uwaga:

  • Nie można załadować rozszerzenia jądra Nosleep na High Sierra
  • Prywatny interfejs SPI NIE jest obsługiwany przez Apple po High Sierra. Fermata przeszła na pmsetmetodę po wersji 1.1
  • Może być konieczne wyłączenie Gatekeeper, aby bezsenność działała zgodnie z oczekiwaniami.
  • Inne aplikacje, które wypróbowałem, nie działają z zamkniętą pokrywą
Simba
źródło
1

Próbowałeś już tej aplikacji ? Uważam, że jest to bardzo przydatne do tego, czego szukasz.

Jestem całkiem pewien, że ma on funkcję limitu czasu ustawioną w ustawieniach aplikacji.

Mitchell D.
źródło
6
Dzięki @ mitchell-d. Pytanie dotyczy w szczególności rodzimego rozwiązania, takiego jak kofeina. Istnieją inne aplikacje sugerowane w „ is-any-to-any-set-a-macbook-pro-to-not-sleep-when-you-close-the-lid” Mimo to wypróbowałem aplikację kofeinową, którą polecasz nie przeszkadza mojemu Macbookowi spać po zamknięciu pokrywy
tutaj