Я пытаюсь сэкономить электроэнергию, переключая рабочие столы в режим ожидания, когда они неактивны. Но многие настольные компьютеры также доступны через SSH их владельцами. Существует развернутое решение wakeonlan, позволяющее владельцам включать машину, но проблема в том, что машины снова автоматически приостанавливаются через 10 минут, даже если соединение SSH включено.
Я пытаюсь включить активные сеансы SSH в определения «активность».
Вопрос в том, можно ли это сделать, установив правило polkit? Можно ли это сделать, поместив скрипт, который выполняется до фактического приостановления, и прервет его, если будут найдены сеансы SSH? Мне нужен чистый законный способ сделать это. Если не это, то хакерские пути тоже приветствуются.
Текущее наивное хакерское решение: edit /usr/sbin/pm-suspend
:
#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
echo "SSH session(s) are on. Not suspending."
exit 1
fi
Это служит цели. Но я не знаю, когда обновление перезапишет файл /usr/sbin/pm-suspend
. Я также не знаю, как это будет работать с другими реализациями приостановки, такими как tuxonice.
источник
grep -cv :0
вместо прохожденияwc
?[
если вы пишетеif who | grep -qv :0; then
(при условии, что у вас есть POSIX, соответствующийgrep
GNU grep).Ответы:
До Ubuntu 14.10 (на основе Upstart)
Посмотрите
pm-action(8)
и найдите/etc/pm/sleep.d
в разделе «ФАЙЛЫ». Если один из этих сценариев возвращается с ненулевым состоянием выхода, приостановка предотвращается.Обновлены инструкции для наглядности:
Итак, создайте файл
/etc/pm/sleep.d/05_ssh_keepawake
.Поместите shebang (
#!/bin/sh
) и код, упомянутый в вопросе в этом файле.Установите разрешения на выполнение для него:
Начиная с Ubuntu 15.04 (на основе systemd)
systemd не использует pm-utils для управления хуками состояния питания, но имеет собственную инфраструктуру для этой же цели. Проверки ингибитора сна больше не выполняются во время сна, но должны быть установлены действием, которое запрещает сон (см. 1 ).
Таким образом, вам нужно будет добавить команды входа и выхода из сеанса SSH, которые регистрируют ингибитор сна с помощью systemd (например, через
systemd-inhibit(1)
), а затем освобождают ингибитор. Если кто-то знает, как подключиться к входу и выходу из SSH, я бы приветствовал комментарий или изменение, чтобы мы могли выработать соответствующие шаги и команды.Следующий раздел находится в стадии разработки - используйте его только тогда, когда вы знаете, что делаете!
Вы можете написать системный модуль,
/etc/systemd/system/ssh-inhibt-sleep.service
который зависит отsleep.target
использования этойRequiredBy
опции. Если ваш новый модуль выходит из строя (с ненулевым статусом выхода из вызванного процесса), он выполнитsleep.target
и, следовательно, последующее действие в спящем режиме.Как всегда, вам нужно активировать системные модули, чтобы они вступили в силу:
Для получения дополнительной информации см
systemd.unit(5)
иsystemd.service(5)
.источник