Use cafeína para evitar que o sono feche a tampa da bateria

41

O caffeinateutilitário nativo não está funcionando para impedir que meu macbook durma ao fechar a tela. Em vez disso, o sistema dorme e vários serviços de rede (VPN, compartilhamento de tela, chamadas VOIP, clientes de mensagens, transferências de arquivos) falham enquanto eu ando da minha mesa para a minha reunião em menos de 5 minutos.

Andar por aí com a tampa do laptop meio aberta dificulta o transporte seguro do meu café e é nitidamente não-legal.

O caffeinateutilitário nativo foi projetado para lidar com isso como um substituto fácil de usar pmset, mas parece ter sido projetado para não funcionar quando desconectado da energia CA.

Documentos via man caffeinate

-s Crie uma asserção para impedir que o sistema durma. Esta afirmação é válida somente quando o sistema está a funcionar com energia AC .

À procura de uma alternativa nativa ao InsomniaX ou ao sono .

Um recurso de tempo limite é essencial para evitar que eu coloque acidentalmente meu macbook não-morto em uma bolsa, resultando em uma bagunça quente. ( caffeinate -t, especifica o valor do tempo limite em segundos)

Aqui
fonte
Receio que não haja alternativa nativa , pois um MacBook deve dormir quando você fechá-lo. : - /
Asmus
2
Andar com o MacBook é exatamente por isso que também quero uma solução para evitar o sono quando a tampa estiver fechada.
theonlygusti 19/09/17
Você tentou a opção -t, como caffeinate -t 3600? De acordo com a minha experiência, ele funciona mesmo se o macbook estiver funcionando com bateria.
Qiang Xu
Obrigado pela sugestão, não funcionou nas tentativas iniciais. Estou esquecendo de algo? Testado 1) caffeinate -t 36002) Feche o laptop 3) Aguarde 5s 4) Abra o laptop para encontrar a tela de login e os serviços de rede desconectados.
aqui
@ aqui eu não tentei fechar a tampa. Eu apenas executei o comando com a -topção quando o meu macbook está na bateria e ele não dormiu. Não tentei com a tampa fechada, mas parece que o macbook será forçado a dormir assim que você fechar a tampa. Desculpe o meu mal-entendido. Eu estava pensando que você estava procurando uma maneira de fazê-lo funcionar quando funciona apenas com bateria, sem a tampa fechada.
Qiang Xu

Respostas:

37

Não é o ideal, mas aqui está uma solução. Para impedir que o laptop durma quando a tampa estiver fechada e você estiver usando a bateria, execute os seguintes comandos:

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

Para reativar o laptop em suspensão quando a tampa estiver fechada e você estiver usando a bateria, execute os seguintes comandos:

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

O "5" no segundo conjunto de comandos representa o número de minutos antes de dormir quando estiver na bateria; ajuste conforme desejado para o seu laptop.

Isso é um pouco perigoso, pois se você esquecer de reativar suas configurações, o laptop nunca irá dormir quando estiver com a bateria. Por isso, escrevi um script de shell para reativar automaticamente as configurações:

#!/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

O script do shell desativará Entero modo de suspensão até que você pressione a tecla; nesse momento, ele reativará as configurações de suspensão (como alternativa, você pode pressionar Ctrl- Ce conseguir a mesma coisa). Ele também definirá um tempo limite (o padrão é 300 segundos / 5 minutos), após o qual as configurações de suspensão serão reativadas automaticamente e o laptop será forçado a dormir. Embora isso seja doloroso se você estiver usando o laptop em uma reunião, será um salva-vidas se você esquecer e colocar o laptop na bolsa para ir para casa.

Os leitores astutos notarão que esses comandos exigem sudo; infelizmente, isso é inevitável AFAIK. O que fiz no meu sistema é torná-lo para que não precise digitar minha senha para executar pmsetcomo root. Para fazer isso, edite o sudoersarquivo ( sudo visudo) e adicione esta linha:

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

substituindo "joe" pelo seu nome de usuário. Você provavelmente poderia alcançar o mesmo resultado (ou seja, executando o script sem precisar digitar sua senha) executando o shell script SETUID, mas não gosto disso; abrir esse comando por meio de sudoers parece menos arriscado para mim.

Para executar o script, cole-o em um diretório no seu PATHe chame-o da seguinte maneira:

noz [<timeout in seconds>]

Quando você chegar aonde está indo, basta pressionar Enterou Ctrl- Ce você está pronto para ir. E se você esquecer, ele será redefinido automaticamente e entrará em suspensão.

Provavelmente existe uma maneira de conseguir tudo isso via AppleScript, para que você possa atribuir uma tecla de atalho e o que não; Vou tentar isso se me cansar de executar isso na linha de comando.

Joe Casadonte
fonte
6
Legal! Muito obrigado! Uma sugestão / simplificação: não acho que você precise alterar a sleepconfiguração. Basta ligar disablesleepe desligar. pmset -a disablesleep 1e pmset -a disablesleep 0funciona bem para mim. Meu MacBook não dorme quando fecho a tampa. Todas as outras configurações permanecem as mesmas.
jcsahnwaldt diz GoFundMonica
O usuário do Github iccir criou um aplicativo gratuito chamado Fermata, que usa esse truque sob o capô e o envolve com um ícone na barra de menus e um temporizador, etc. Eu tentei no Mojave (10.14.2) e funcionou muito bem para mim. github.com/iccir/Fermata
Alex Ryan
5

O usuário do Github iccir criou um pequeno aplicativo de barra de menus gratuito chamado Fermata, que faz exatamente o que você deseja: mantém um MacBook acordado com a tampa fechada e permite definir uma duração de tempo limite.

Eu apenas tentei no Mojave (10.14.2) e funcionou muito bem para mim. https://github.com/iccir/Fermata

Alex Ryan
fonte
5

Não existe uma maneira nativa de fazer isso. Aqui está o que eu recebi após algumas pesquisas e testes:

insira a descrição da imagem aqui

Nota:

  • A extensão do kernel do Nosleep falhou ao ser carregada no High Sierra
  • O SPI privado NÃO é suportado pela Apple após o High Sierra. Fermata mudou para o pmsetmétodo após a versão 1.1
  • Pode ser necessário desativar o Gatekeeper para permitir que o Insomnia funcione conforme o esperado.
  • Os outros aplicativos que tentei não funcionam com a tampa fechada
Simba
fonte
1

Você já experimentou este aplicativo ? Acho muito útil exatamente para o que você procura.

Tenho certeza de que ele possui um recurso de tempo limite definido nas configurações do aplicativo.

Mitchell D
fonte
6
Obrigado @ mitchell-d. A questão é pedir especificamente uma solução nativa, como o cafeína. Existem outros aplicativos sugeridos em "existe alguma maneira de definir um macbook" para não dormir quando você fecha a tampa? No entanto, eu tentei o aplicativo de cafeína que você recomenda não impeça o meu macbook de dormir quando fecho a tampa.
aqui