使用咖啡因以防止电池盖上的盖子睡着


41

caffeinate关闭显示器时,本机实用程序无法防止Macbook进入睡眠状态。相反,当我在不到5分钟的时间内从办公桌步行到会议时,系统进入睡眠状态,并且各种网络服务(VPN,屏幕共享,VOIP呼叫,消息传递客户端,文件传输)都失败了。

在笔记本电脑的盖子半开的情况下走来走去,很难安全地携带我的咖啡,而且明显不凉爽。

本机caffeinate实用程序旨在将其作为的用户友好替代程序来处理pmset,但在断开交流电源连接时似乎无法使用。

文件通过 man caffeinate

-s创建一个断言以防止系统进入休眠状态。仅当系统使用交流电源运行时,此声明才有效。

寻找InsomniaXnosleep的本机替代品。

超时功能是必不可少的,这样我就可以避免将不死的Macbook意外塞入书包,而导致混乱。(caffeinate -t,以秒为单位指定超时值)


我担心没有本机替代品,因为MacBook在关闭时会休眠。:-/
Asmus

2
带着MacBook走动正是我也想要一种在盖子关闭时防止睡眠的解决方案的原因。
theonlygusti

您是否尝试过该选项-t,例如caffeinate -t 3600?根据我的经验,即使Macbook依靠电池运行,它也可以工作。
徐强

感谢您的建议,最初的尝试没有用。我想念什么吗?经过测试1)caffeinate -t 36002)关闭笔记本电脑3)等待5s 4)打开笔记本电脑以查找登录屏幕和断开的网络服务。
这里

@在这里,我没有尝试关闭盖子。-t当我的Macbook电池没电时,我只运行了带选项的命令,但它没有进入睡眠状态。我还没有尝试过关闭盖子,但是看起来一旦关闭盖子,MacBook就会被迫入睡。对不起,我的误会。我以为您正在寻找一种方法,使其仅在不关闭盒盖的情况下依靠电池运行。
徐强

Answers:


37

这不是理想的方法,但这是一个解决方案。为防止笔记本计算机在机盖关闭且使用电池供电时休眠,请运行以下命令:

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

要在盖上盖子并且使用电池供电时重新启用笔记本电脑的睡眠功能,请运行以下命令:

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

第二组命令中的“ 5”表示电池供电后进入睡眠状态的分钟数;根据您的笔记本电脑进行调整。

这有点危险,因为如果您忘记重新启用设置,则笔记本计算机在为电池供电时将永远不会休眠。因此,我编写了一个Shell脚本来自动重新启用设置:

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

Shell脚本将禁用睡眠功能,直到您按下Enter按键为止,这时它将重新启用睡眠设置(或者,您可以击中Ctrl- C并且实现相同的操作)。它还将设置一个超时时间(默认为300秒/ 5分钟),之后将自动重新启用睡眠设置,并且笔记本电脑将被迫进入睡眠状态。如果在会议中使用笔记本电脑会很痛苦,但是如果忘记了并将笔记本电脑放在包里回家,那将是一个救命稻草。

精明的读者将注意到这些命令需要sudo; 可悲的是,这是不可避免的AFAIK。我在系统上所做的就是创建它,因此不必输入密码即可以pmsetroot 用户身份运行。为此,请编辑sudoers文件(sudo visudo)并添加以下行:

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

用您的用户名替换“ joe”。您可以通过运行Shell脚本SETUID来达到相同的结果(即,无需输入密码即可运行脚本),但是我不喜欢这样做。通过sudoers打开此命令对我来说风险较小。

要运行该脚本,请将其粘贴到您的目录中,PATH然后按以下方式调用它:

noz [<timeout in seconds>]

当你到了你要去的地方,只需点击EnterCtrl- C你是好去。如果您忘记了它,它将自动重置并进入睡眠状态。

可能有一种方法可以通过AppleScript来实现所有这些目的,以便您可以为其分配一个热键,而不能给它分配热键。如果我对从命令行运行它感到厌倦,我会尝试一下。


6
凉!非常感谢!一个建议/简化:我认为您不需要更改sleep设置。只需打开disablesleep和关闭即可。pmset -a disablesleep 1pmset -a disablesleep 0工作对我罚款。当我合上盖子时,我的MacBook没有进入睡眠状态。所有其他设置保持不变。
jcsahnwaldt

Github用户iccir制作了一个名为Fermata的免费应用程序,该应用程序在后台使用了该技巧,并通过菜单栏图标和计时器等将其很好地包装起来。我刚刚在Mojave(10.14.2)上试用了它,对我来说非常有用。github.com/iccir/Fermata
亚历克斯·瑞安


5

没有本地方法可以做到这一点。经过一些搜索和试验,这是我得到的:

在此处输入图片说明

注意:

  • Nosleep的内核扩展未能在High Sierra上加载
  • High Sierra之后,Apple不支持私有SPI。Fermatapmset在版本1.1之后切换到该方法
  • 您可能需要禁用Gatekeeper才能使失眠按预期进行。
  • 我尝试过的其他应用在关闭盖子后无法使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.