在指定的时间内保持 MacBook 在盖子关闭的情况下运行

Cap*_*rog 8 mac laptop sleep macbook macos

有时,让 MacBook 运行一个小时左右以在一天结束时完成更新或一些冗长的数据分析会很有用。我希望能够合上 MacBook 的盖子或关闭屏幕以防止不必要的光污染。

我以前使用过两个应用程序 Caffeine 和 NoSleep,让 MacBook 保持清醒。

  • 咖啡因允许您指定让 MacBook 保持唤醒状态的持续时间,但合上盖子会使笔记本电脑进入睡眠状态。
  • NoSleep 允许您关闭笔记本电脑的盖子(关闭屏幕,保持任何进程运行),但您不能指定超时持续时间。

我正在寻找一种解决方案,既允许用户关闭盖子指定超时持续时间。我不想让笔记本电脑整夜运行;通常只需 30 分钟到一个小时。

任何解决方案?

Joe*_*nte 10

这并不理想,但这里有一个解决方案。为防止笔记本电脑在盖子合上且使用电池运行时进入睡眠状态,请运行以下命令:

sudo pmset -b sleep 0; sudo pmset -b disablesleep 1
Run Code Online (Sandbox Code Playgroud)

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

sudo pmset -b sleep 5; sudo pmset -b disablesleep 0
Run Code Online (Sandbox Code Playgroud)

第二组命令中的“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
Run Code Online (Sandbox Code Playgroud)

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

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

joe ALL=(ALL) NOPASSWD: /usr/bin/pmset
Run Code Online (Sandbox Code Playgroud)

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

要运行该脚本,请将其粘贴在您的目录中PATH并按如下方式调用它:

$ noz [<timeout in seconds>]
Run Code Online (Sandbox Code Playgroud)

当你到达你要去的地方时,只需点击EnterCtrl-C你就可以走了。如果您忘记了它,它会自动重置并休眠。

可能有一种方法可以通过 AppleScript 实现所有这些,这样您就可以为它分配一个热键,什么不是;如果我厌倦了从命令行运行它,我会尝试这样做。


Ale*_*yan 3

Github 用户iccir 制作了一个非常方便的小菜单栏应用程序,名为 Fermata,它完全可以满足您的需求:在合上盖子的情况下使 MacBook 保持唤醒状态,\xc2\xa0 并允许您设置超时持续时间。

\n\n

我刚刚在 Mojave (10.14.2) 上尝试过,它对我来说效果很好。https://github.com/iccir/Fermata

\n