3

Иногда полезно оставлять MacBook включенным в течение часа или около того, чтобы завершить обновления или какой-то длительный анализ данных в конце дня. Я хотел бы иметь возможность закрыть крышку MacBook или выключить экран, чтобы избежать ненужного светового загрязнения.

Ранее я использовал два приложения, Caffeine и NoSleep, чтобы MacBook не спал.

  • Кофеин позволяет указать время, в течение которого MacBook не спит, но закрывая крышку, ноутбук уходит в режим сна.
  • NoSleep позволяет вам закрыть крышку ноутбука (которая выключает экран, сохраняя все процессы запущенными), но вы не можете указать время ожидания.

Я ищу решение, которое позволяет пользователю закрывать крышку и указывать время ожидания. Я не хочу оставлять ноутбук включенным всю ночь; обычно от 30 минут до часа.

Какие-либо решения?

4 ответа4

6

Это не идеально, но вот решение. Чтобы ноутбук не спал, когда крышка закрыта и вы работаете от батареи, выполните следующие команды:

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

Чтобы снова включить режим ожидания ноутбука, когда крышка закрыта и вы работаете от батареи, выполните следующие команды:

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

"5" во втором наборе команд представляет количество минут перед сном при работе от батареи; отрегулируйте по желанию для вашего ноутбука

Это немного опасно, так как, если вы забудете повторно включить ваши настройки, ноутбук никогда не будет спать, когда работает от батареи. Из-за этого я написал сценарий оболочки для автоматического повторного включения настроек:

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

Сценарий оболочки будет отключать спящий режим до тех пор, пока вы не нажмете клавишу Enter , после чего он снова включит настройки спящего режима (альтернативно, вы можете нажать Ctrl- C и добиться того же). Также будет установлен тайм-аут (по умолчанию 300 секунд /5 минут), после которого настройки сна будут автоматически повторно включены, и ноутбук будет вынужден перейти в спящий режим. Хотя это будет больно, если вы используете свой ноутбук на собрании, это спасет вас, если вы забудете и положите свой ноутбук в сумку, чтобы пойти домой.

Внимательные читатели заметят, что эти команды требуют sudo ; к сожалению, это неизбежно AFAIK. В моей системе я сделал так, чтобы мне не приходилось вводить пароль для запуска pmset от имени пользователя root. Для этого отредактируйте файл sudoers (sudo visudo) и добавьте следующую строку:

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

заменив "Джо" на ваше имя пользователя. Вероятно, вы могли бы достичь того же результата (т.е. запустить скрипт без необходимости ввода пароля), запустив сценарий оболочки SETUID, но мне это не нравится; открытие этой команды через sudoers кажется мне менее рискованным.

Чтобы запустить скрипт, поместите его в каталог в вашей PATH и вызовите его так:

$ noz [<timeout in seconds>]

Когда вы доберетесь до места, просто нажмите Enter или Ctrl - C, и все готово. И если вы забудете об этом, он автоматически сбросится и уснет.

Вероятно, есть способ добиться всего этого через AppleScript, так что вы можете назначить ему горячую клавишу, а что нет; Я попробую это, если мне даже надоест запускать это из командной строки.

0

Предполагается, что NoSleep был разработан для работы со стандартными настройками сна OSX (см. Здесь. Предполагается, что NoSleep предотвращает сон только при закрытии крышки (по крайней мере, так было задумано).

Если это не происходит, единственный официальный способ закрыть крышку без сна - это подключить внешнюю мышь, клавиатуру и монитор.

0

Пользователь Github iccir создал очень удобное маленькое приложение под названием Fermata, которое делает именно то, что вы хотите: держит MacBook в активном состоянии с закрытой крышкой и позволяет установить время ожидания.

Я только что попробовал это на Мохаве (10.14.2), и он отлично работал для меня. https://github.com/iccir/Fermata

-1

Приложение амфетамина может сделать это сейчас. Он включает в себя все виды триггеров, в том числе для запущенных приложений или заданных временных интервалов, поэтому он должен полностью соответствовать исходному сценарию использования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .