有时,让 MacBook 运行一小时左右以在一天结束时完成更新或一些冗长的数据分析很有用。我希望能够合上 MacBook 的盖子或关闭屏幕,以防止不必要的光污染。
我之前曾使用过两个应用程序 Caffeine 和 NoSleep 来让 MacBook 保持唤醒状态。
- Caffeine 允许您指定让 MacBook 保持唤醒状态的持续时间,但合上盖子会使笔记本电脑进入睡眠状态。
- NoSleep 允许您关闭笔记本电脑的盖子(关闭屏幕,保持所有进程继续运行),但您无法指定超时时间。
我正在寻找一种既允许用户关闭盖子的解决方案和指定超时时长。我不想让笔记本电脑整晚运行;通常只需 30 分钟到一个小时。
有什么解决办法吗?
答案1
Github 用户 iccir 制作了一个非常方便的小菜单栏应用程序,名为 Fermata,它完全可以满足您的需求:在盖子关闭的情况下保持 MacBook 处于唤醒状态,并允许您设置超时时间。
我刚刚在 Mojave (10.14.2) 上尝试过,效果非常好。https://github.com/iccir/Fermata
答案2
这不是理想的解决方案,但这里有一个解决方案。为了防止笔记本电脑在盖子关闭并使用电池供电时进入睡眠状态,请运行以下命令:
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
;遗憾的是,据我所知这是不可避免的。我在系统上所做的就是使我不必输入密码即可以pmset
root 身份运行。为此,请编辑sudoers
文件 ( sudo visudo
) 并添加以下行:
joe ALL=(ALL) NOPASSWD: /usr/bin/pmset
将“joe”替换为您的用户名。通过运行 shell 脚本 SETUID,您可能可以实现相同的结果(即运行脚本而无需输入密码),但我不喜欢这样做;通过 sudoers 打开这个命令对我来说似乎风险较小。
要运行该脚本,请将其粘贴到您的目录中PATH
并按如下方式调用它:
$ noz [<timeout in seconds>]
当您到达目的地时,只需点击Enter或Ctrl-C即可出发。如果您忘记了,它会自动重置并进入睡眠状态。
可能有一种方法可以通过 AppleScript 实现所有这些,以便您可以为其分配一个热键等等;如果我厌倦了从命令行运行它,我会尝试这样做。
答案3
NoSleep 的设计初衷是为了配合 OSX 的默认睡眠设置(这里。NoSleep 仅用于防止在合上盖子时进入睡眠状态(至少,这是如何设计)。
如果没有发生这种情况,唯一能够关闭盖子而不进入睡眠状态的官方方法是连接外接鼠标、键盘和显示器。
答案4
安非他明应用程序现在就可以做到这一点。它包括各种触发器,包括应用程序运行或指定时间量,因此它应该可以很好地覆盖原始用例。