Предотвращение сна компьютера, когда включены соединения SSH

13

Я пытаюсь сэкономить электроэнергию, переключая рабочие столы в режим ожидания, когда они неактивны. Но многие настольные компьютеры также доступны через 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.

Бхавин Доши
источник
2
Могу ли я предложить использовать grep -cv :0вместо прохождения wc?
Тердон
1
Еще одна идея для большей элегантности: вы можете отказаться от вызова, [если вы пишете if who | grep -qv :0; then(при условии, что у вас есть POSIX, соответствующий grepGNU grep).
Дэвид Фёрстер

Ответы:

19

До Ubuntu 14.10 (на основе Upstart)

Посмотрите pm-action(8)и найдите /etc/pm/sleep.dв разделе «ФАЙЛЫ». Если один из этих сценариев возвращается с ненулевым состоянием выхода, приостановка предотвращается.

Обновлены инструкции для наглядности:

  1. Итак, создайте файл /etc/pm/sleep.d/05_ssh_keepawake.

  2. Поместите shebang ( #!/bin/sh) и код, упомянутый в вопросе в этом файле.

  3. Установите разрешения на выполнение для него:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

Начиная с 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и, следовательно, последующее действие в спящем режиме.

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

Как всегда, вам нужно активировать системные модули, чтобы они вступили в силу:

sudo systemctl enable ssh-inhibt-sleep.service

Для получения дополнительной информации см systemd.unit(5)и systemd.service(5).

Дэвид Фёрстер
источник
это не похоже на работу в 18.04. Это уже не решение?
Майкл Джаррет
1
@MichaelJarret: Действительно. Я обновил свой вопрос, предоставив некоторую информацию о ситуации с systemd.
Дэвид Фёрстер
Я нашел следующее, пытаясь разобраться в этом вчера, но не смог изменить предыдущий сценарий, чтобы выполнить работу здесь
Майкл Джаррет
Я не могу отредактировать свой комментарий, но это также кажется уместным
Майкл Джаррет
1
@MichaelJarret: У меня была еще одна идея, которую вы могли бы попробовать. Смотрите обновление к моему ответу.
Дэвид Фёрстер