Не дозволяйте машині спати, коли включені з'єднання SSH


13

Я намагаюся економити енергію, перемикаючи настільні та призупиняючи режим, коли вони неактивні. Але багато робочих столів також мають доступ через SSH власниками. Є розроблене рішення wakeonlan, яке дозволяє власникам увімкнути машину, але проблема полягає в тому, що машини автоматично припинять роботу через 10 хвилин, навіть якщо з'єднання SSH увімкнено.

Що я намагаюся зробити, це включити активні сеанси SSH у визначення "активності".

Питання, чи можна це зробити, встановивши правило polkit? Чи можна це зробити, поставивши скрипт, який запускається до фактичного призупинення, і скасовує його, якщо знайдені сеанси SSH? Мені потрібен чистий законний спосіб зробити це. Якщо це не так, то також вітаються хитрі способи.

Поточне наївне хакі рішення: редагувати /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 відповідає grepтипу GNU grep).
Девід Фоерстер

Відповіді:


19

До Ubuntu 14.10 (на основі версії)

Ознайомтесь 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 не використовує pm-утиліти для управління своїми гаками стану електроживлення, але має свою власну інфраструктуру до того ж кінця. Перевірки інгібіторів сну більше не виконуються у режимі сну, але повинні встановлюватися дією, що гальмує сон (див. 1 ).

Як такий, вам доведеться додати команди до входу та виходу із сеансу SSH, який реєструє інгібітор сну із системою (наприклад, через 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: У мене була інша ідея, яку можна спробувати. Дивіться оновлення моєї відповіді.
Девід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.