Вопрос или проблема
Когда я ssh на компьютер OS X в своей сети, сессия продолжается до тех пор, пока OS X не перейдет в режим сна.
Существует ли способ предотвратить это во время моей SSH сессии, кроме как физически двигать мышью или набирать на клавиатуре, либо вручную отключать функцию сна?
ПРАВКА: SSH сессия обычно является простой настройкой sshfs.
Это позволяет мне использовать мой мак через SSH независимо от всего, пока мак подключен к источнику питания.
Все выключается, когда мак отключается от источника питания, так что не нужно беспокоиться о времени работы от батареи.
Это решение не является готовым, но, возможно, оно сработает, если никто другой не предложит решение 🙂
Вы можете управлять настройками энергосбережения с помощью команды pmset
. Ознакомьтесь с man-страницей для получения дополнительной информации.
Интересная настройка, которую мы хотим изменить, это sleep:
sleep – таймер перехода в режим сна (значение в
минутах или 0 для отключения)
Таким образом, мы можем использовать следующие команды:
sudo pmset sleep 25 # переход в сон через 25 минут
sudo pmset sleep 0 # отключить сон
Теперь нам нужно выполнить эти команды после входа и выхода из системы. Если я правильно помню, Bash является оболочкой по умолчанию для Mac OS X, что приводит нас к следующим двум файлам:
~/.bash_profile Персональный файл инициализации, выполняемый для входящих оболочек ~/.bash_logout Файл очистки индивидуальной входящей оболочки, выполняемый при выходе из входящей оболочки
Отредактируйте или создайте их в вашем домашнем каталоге и добавьте соответствующие команды. Если хотите, сохраните текущее значение сна во временном файле и затем восстановите его оттуда.
Последняя проблема, которую нужно решить, это запрос пароля от sudo. Чтобы дать вашему пользователю разрешение вызывать pmset без пароля, отредактируйте ваш /etc/sudoers с помощью sudoedit. Вам нужно использовать тег NOPASSWD
. Если это ново для вас, ознакомьтесь с руководством по sudoers.
Чтобы использовать SSH для открытия оболочки на удаленной машине OSX и предотвратить ее сон на время SSH-сессии:
$ ssh -t me@mymacbook caffeinate -i bash
Встроенная утилита pmset в OS X имеет настройку, которая может сделать то, что вам нужно. Ознакомьтесь с man-страницей pmset
для настройки ttyskeepawake
и сопутствующим объяснением.
Следующая команда, вероятно, сделает то, что вам нужно:
sudo pmset -c ttyskeepawake 1
Флаг -c
делает эту настройку активной именно тогда, когда компьютер работает от сети переменного тока (а не от батареи или ИБП), а ttyskeepawake 1
предотвращает переход компьютера в режим сна во время активной сессии tty (предположительно, удаленной). Это разрешит сон, если сессия была неактивной более времени, указанного таймером сна, но если это проблема, возможно, компьютер вообще не следует ставить в режим сна.
Начиная с Mac OS X 10.8, вы должны иметь возможность использовать команду caffeinate(8)
.
Попробуйте caffeinate -s ssh server.example.com
.
Я добавил следующий скрипт в .bash_profile
if expr "$(ps -o comm= $PPID)" : '^sshd:' > /dev/null; then
caffeinate -s $SHELL --login
exit $?
fi
Если процесс является прямым потомком демона ssh, запускайте ту же оболочку через команду caffeinate
, чтобы предотвратить переход системы в режим сна во время ssh-сессии.
Поиск в интернете по запросу mac prevent sleep дает много полезной информации о утилитах и трюках, которые вы можете использовать.
Однако в вашей ситуации я подозреваю, что вы действительно хотите иметь отдельную ssh-сессию, которая запускает очень простую программу командной строки, предотвращающую переход Mac в режим сна. Apple предоставляет полный исходный код в Техническом Q&A 1160: Запрет сна. (К сожалению, эта страница сейчас недоступна на сайте Apple, но вы можете найти копию в кэше Google.)
Я не проверял, может ли эта программа успешно выполняться из ssh-сессии, но похоже, что может.
Обратите внимание, что реализации sshfs обычно не остаются подключенными к удаленной системе постоянно, и просто запускают сессию, когда им нужно файлы или каталоги. Поэтому вам нужна отдельная ssh-сессия, работающая в минимизированном окне терминала, чтобы запускать программу бессонницы.
Преимущество такого подхода в том, что вам не нужно использовать sudo или вмешиваться в настройки управления питанием системы.
Другие ответы включают множество ручной работы, поэтому я написал этот инструмент, чтобы все делалось автоматически, каждый раз, когда вы входите в свой мак по ssh. Он предотвратит переход в режим сна, пока крышка открыта и пока закрыта, и не запутается, когда есть несколько одновременных ssh-сессий. Он не предотвращает сон, когда терминал открыт на рабочем столе мака. Он написан на Perl, но поскольку это не язык, на котором все хорошо разбираются, я использовал очень простой синтаксис и много комментариев на случай, если что-то очень уникальное для Perl происходит. Я бы написал это на shell, но он не имеет хорошей поддержки советующих блокировок файлов.
Ответ или решение
Чтобы предотвратить переход компьютера на Mac OS X в спящий режим во время SSH-сессии, можно воспользоваться несколькими методами. Этот вопрос интересует многих пользователей, и существует несколько решений, которые могут помочь.
1. Использование команды caffeinate
С начала Mac OS X 10.8 в систему была внедрена команда caffeinate
, которая позволяет предотвратить переход в спящий режим. Вы можете использовать эту команду во время вашей SSH-сессии следующим образом:
ssh -t пользователь@ваш_мак caffeinate -i bash
Флаг -i
предотвращает засыпание системы во время активного интерактивного сеанса. Это самый простой способ удерживать машину в активном состоянии.
2. Настройка pmset
Вы можете изменить настройки управления энергопотреблением с помощью утилиты pmset
. Откройте терминал и выполните команды:
sudo pmset -c ttyskeepawake 1
Флаг -c
активирует эту настройку только при питании от сети. Это значит, что компьютер не будет переходить в спящий режим, пока активна сессия терминала через SSH.
3. Сохранение и восстановление настроек при входе и выходе
Если вы хотите, чтобы настройки pmset
менялись автоматически при входе и выходе из SSH-сессии, вы можете использовать ~/.bash_profile
и ~/.bash_logout
для автоматизации:
Добавьте в ~/.bash_profile
:
sudo pmset sleep 0
Добавьте в ~/.bash_logout
:
sudo pmset sleep 25
Не забудьте предоставить своему пользователю возможность выполнять pmset
без ввода пароля, добавив следующую строку в файл /etc/sudoers
:
ваш_пользователь ALL=(ALL) NOPASSWD: /usr/bin/pmset
4. Используйте скрипты
Вы также можете создать скрипт, который будет автоматически запускать caffeinate
при входе в SSH. Например, добавьте следующее в ваш ~/.bash_profile
:
if expr "$(ps -o comm= $PPID)" : '^sshd:' > /dev/null; then
caffeinate -s $SHELL --login
exit $?
fi
Этот код проверяет, запущена ли сессия SSH, и при необходимости запускает caffeinate
.
5. Дополнительные утилиты
Если вы хотите более гибкий способ управления временем сна, вы можете рассмотреть использование сторонних утилит. Например, есть инструменты, разработанные сообществом, такие как pmset-session, которые автоматизируют предотвращение сна при SSH-соединении.
Заключение
С помощью этих методов вы сможете управлять режимом сна вашего Mac во время SSH-сессий. Выберите тот способ, который лучше всего подходит для вашего рабочего процесса. Наилучший и наиболее универсальный способ — это использование команды caffeinate
, однако, для более глубокой кастомизации могут потребоваться другие методы, описанные выше.