Вопрос или проблема
У меня есть 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
могут быть ограничены в зависимости от прав доступа. Для обычных пользователей доступны следующие способы:
-
Запрос на предотвращение перехода в спящий режим (idle):
systemd-inhibit --what=idle --why="Compiling TF" nohup bazel build ...
Эта команда предотвратит переход системы в режим ожидания, пока выполняется ваша сборка.
-
Применение elogind:
Если ваша система работает сelogind
, командаelogind-inhibit
предоставляет больше возможностей для управления состоянием системы без необходимости получения прав суперпользователя. Например, вы можете использовать--what=sleep
,--what=shutdown
и другие параметры:elogind-inhibit --what=sleep --why="Compiling TF" nohup bazel build ...
Настройка прав доступа с помощью PolicyKit
Если вам необходимо использовать более расширенные функции для блокировки перехода в спящий режим или перезагрузки, необходимо настроить PolicyKit. Вот как это сделать:
-
Создание правила в 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; } });
-
Перезапуск PolicyKit:
После добавления файла необходимо перезапустить службу PolicyKit для применения изменений:sudo systemctl restart polkit
-
Проверка работы настройки:
Чтобы убедиться, что вы можете теперь использовать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.