Как использовать systemd-inhibit без sudo?

Вопрос или проблема

У меня есть SBC (pine64), работающий на Ubuntu 16_04, и мне нужно выполнить длительный процесс (собрать tensorflow). Я использую команду nohup, чтобы отсоединить процесс от своей SSH-сессии, но два дня подряд моя плата перезагружалась в полночь. Я увидел, что могу предотвратить перезагрузку, сон и выключение с помощью systemd-inhibit.

Есть ли способ использовать эту команду без sudo? Bazel build не видит мой %JAVA_HOME при запуске с sudo

Вот команда, которую я пытаюсь запустить:

systemd-inhibit --why="Сборка TF" nohup bazel build -c opt --copt="-funsafe-math-optimiza
tions" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --verbose_failures tensorflow/tools/pip_package:build_pip_pa
ckage &  

которая выдает мне:

Не удалось предотвратить: Доступ запрещен

Есть какие-нибудь советы?

Вы можете использовать systemd-inhibit --what=idle как обычный пользователь, чтобы предотвратить переход машины в спящий режим из-за бездействия системы. Остальные блокировки требуют повышенных привилегий.

Я тестировал команды systemd-inhibit --what=idle и systemd-inhibit --what=sleep, обе из них можно использовать обычным пользователем.

Кстати, если вы используете elogind-inhibit, все аргументы --what= работают (если вы установите один).

Можно настроить polkit, чтобы разрешить пользователям препятствовать переходу в спящий режим. Например, я разрешил пользователям группы wheel препятствовать сну следующим образом:

Как root, добавьте следующее в /etc/polkit-1/rules.d/50-inhibit-sleep-wheel.rules:

polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.login1.inhibit" || 
         action.id == "org.freedesktop.login1.inhibit-block-sleep")
        && subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});

Затем перезапустите polkit (опционально с sudo):

systemctl restart polkit

Протестируйте следующим образом:

systemd-inhibit --what=sleep --who=$(whoami) --why="Тестирование правила Polkit" sleep 10 &
systemd-inhibit --list

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

Не удалось предотвратить: Доступ запрещен

Чтобы создать более сложные правила, проверьте настройки по умолчанию в файле /usr/share/polkit-1/actions/org.freedesktop.login1.policy.

Ответ или решение

Использование systemd-inhibit без sudo: Подробное руководство

Вопрос сохранения процесса в системах Linux, таких как ваша SBC (Single Board Computer) на базе Pine64, часто возникает в контексте долгих вычислительных задач, таких как сборка TensorFlow. Одной из возможностей для предотвращения выключения, перезагрузки или перехода в спящий режим системы является команда systemd-inhibit. Однако, некоторые функции этой команды требуют прав суперпользователя, что может быть проблематично, если ваша задача не работает должным образом с sudo, как в случае с переменной окружения %JAVA_HOME.

Возможности systemd-inhibit для обычных пользователей

По умолчанию команды systemd-inhibit могут быть ограничены в зависимости от прав доступа. Для обычных пользователей доступны следующие способы:

  1. Запрос на предотвращение перехода в спящий режим (idle):

    systemd-inhibit --what=idle --why="Compiling TF" nohup bazel build ...

    Эта команда предотвратит переход системы в режим ожидания, пока выполняется ваша сборка.

  2. Применение elogind:
    Если ваша система работает с elogind, команда elogind-inhibit предоставляет больше возможностей для управления состоянием системы без необходимости получения прав суперпользователя. Например, вы можете использовать --what=sleep, --what=shutdown и другие параметры:

    elogind-inhibit --what=sleep --why="Compiling TF" nohup bazel build ...

Настройка прав доступа с помощью PolicyKit

Если вам необходимо использовать более расширенные функции для блокировки перехода в спящий режим или перезагрузки, необходимо настроить PolicyKit. Вот как это сделать:

  1. Создание правила в PolicyKit:
    Для этого вам нужно создать файл с правилами, который будет разрешать пользователям группы wheel использовать systemd-inhibit для блокировки спящего режима.

    sudo touch /etc/polkit-1/rules.d/50-inhibit-sleep-wheel.rules
    sudo nano /etc/polkit-1/rules.d/50-inhibit-sleep-wheel.rules

    Внутри данного файла добавьте следующий код:

    polkit.addRule(function(action, subject) {
       if ((action.id == "org.freedesktop.login1.inhibit" || 
            action.id == "org.freedesktop.login1.inhibit-block-sleep")
           && subject.isInGroup("wheel")) {
           return polkit.Result.YES;
       }
    });
  2. Перезапуск PolicyKit:
    После добавления файла необходимо перезапустить службу PolicyKit для применения изменений:

    sudo systemctl restart polkit
  3. Проверка работы настройки:
    Чтобы убедиться, что вы можете теперь использовать systemd-inhibit без доступа к sudo, выполните следующие команды:

    systemd-inhibit --what=sleep --who=$(whoami) --why="Testing Polkit Rule" sleep 10 &
    systemd-inhibit --list

    Если настройки применены правильно, вы не должны получить сообщение об ошибке "Access denied".

Заключение

Использование systemd-inhibit без прав суперпользователя требует некоторых хитростей, но с правильной настройкой PolicyKit и пониманием возможностей команды, вы можете эффективно управлять состоянием вашей системы. Это поможет предотвратить отключение или перезагрузку во время длительных задач, таких как сборка TensorFlow на вашей SBC.

Оцените материал
Добавить комментарий

Капча загружается...