Вопрос или проблема
Я пытаюсь собрать пользовательское ядро для своего компьютера, что занимает много времени (как и ожидалось). Возможно ли остановить мой рабочий стол GNOME от перехода в спящий режим, пока компиляция не завершится, а затем, когда я уйду от компьютера на 30 минут, чтобы он перешел в спящий режим?
Я не хочу постоянно отключать режим ожидания (что легко сделать через панель управления системными настройками, но это приводит к потере энергии), а скорее иметь возможность указать (через PID?) мою задачу компиляции и позволить компьютеру перейти в спящий режим, когда она завершится.
Вы можете полностью отключить тайм-аут бездействия.
Например, чтобы отключить тайм-аут ожидания только для сетевого питания, выполните
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
Мне лично кажется совершенно глупым иметь тайм-аут бездействия для перехода компьютера в спящий режим, когда он подключен к сети, по умолчанию и без возможности для обычных людей отключить это.
У меня нет времени на все детали сейчас, но посмотрите Часто задаваемые вопросы GNOME Power Manager “Как заставить мое приложение остановить автоматический переход компьютера в спящий режим“, который указывает на вызовы DBus Inhibit()
и UnInhibit()
.
Предостережение: если процесс, вызывающий Inhibit()
, завершится, ингибирование будет отменено – dbus-send
в скрипте Shell, таким образом, не сработает, но нужен какой-то оберточный скрипт (например, на Python).
(Правка Этот блог пост содержит немного больше информации, также пример на Python, который может быть полезен.)
GNOME разработал хорошее решение этой проблемы в виде утилиты gnome-session-inhibit
. Чтобы воспользоваться этим, вам просто нужно добавить его перед длительной командой, например:
gnome-session-inhibit make
По необходимости можно запускать несколько сеансов ингибирования одновременно. Их можно перечислить, выполнив gnome-session-inhibit -l
. Для получения дополнительных сведений смотрите страницу man.
Хотя я думаю, что @davefiddes уже опубликовал лучший ответ на этот вопрос, также есть несколько расширений для GNOME, чтобы отключить режим ожидания без необходимости изменять какие-либо настройки GNOME:
Caffeine: https://extensions.gnome.org/extension/517/caffeine
Расширение имеет таймеры на бесконечное время, 15 минут, 30 минут и 1 час, но также можно установить пользовательские таймеры.
По умолчанию оно также предотвращает запуск скринсейвера, но это поведение можно отключить через опцию “Разрешить отключение экрана”.
Другим подобным расширением является Espresso (которое является форком Caffeine): https://extensions.gnome.org/extension/4135/espresso
Вы можете обернуть команду make в своем шелле, чтобы временно отключить функцию автоматического ожидания GNOME.
Сначала вам нужно выяснить, как активировать/деактивировать автоматическое ожидание через командную строку. Это, вероятно, можно сделать с помощью gconftool-2. Небольшое исследование и немного хакерства с gconf-editor должны помочь (я не могу особо помочь с этим, я не использую GNOME).
Затем оберните это в функции в вашем шелле:
disable_autosuspend()
{
...
}
enable_autosuspend()
{
...
}
После этого просто используйте следующий обертка:
test -z $MAKEPRG && export MAKEPRG=$(which make)
make()
{
disable_autosuspend
$MAKEPRG $@
enable_autosuspend
}
Переменная MAKEPRG здесь, чтобы хранить путь к реальному make. Проверка здесь на случай, если вы захотите перезагрузить ваш rc файл.
Вы также можете сразу приостановить через dbus, как только компиляция остановится:
dbus-send --print-reply --system --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Suspend
Сгенерируйте 1-часовой пустой видеофайл и воспроизведите его в плеере, который поддерживает MPRIS2. Вы можете создать серию “видео” разной длины и поставить их в плейлист, чтобы получить желаемое время ингибирования.
Он не осведомлен о каком-либо процессе, который может пережить срок ингибирования, но если вы примерно знаете, сколько времени займет процесс, вы, вероятно, сможете его оценить.
В качестве альтернативы, вы можете купить недорогое устройство под названием “mouse jiggler”. Оно выглядит как беспроводной приемник мыши, но имитирует мышь, которая двигается время от времени. У некоторых моделей есть кнопка для переключения функции.
Ответ или решение
Чтобы предотвратить автоматическую приостановку системы GNOME во время продолжительной компиляции, такой как сборка пользовательского ядра, вы можете применить несколько подходов. Ниже приведены основные способы, обеспечивающие временное отключение функции приостановки, что позволит вам избежать потенциальных потерь данных или прерывания работы.
1. Использование gnome-session-inhibit
Инструмент gnome-session-inhibit
— это удобный способ временно предотвратить автоматическую приостановку системы во время выполнения команды. Использование этого инструмента позволяет избежать длительных изменений в настройках и не требует постоянного отключения функции приостановки.
Пример использования:
gnome-session-inhibit make
Эта команда будет удерживать систему от приостановки до тех пор, пока выполняется команда make
. Вы можете увидеть все активные сессии с помощью следующей команды:
gnome-session-inhibit -l
Это даёт вам возможность отслеживать, какие процессы в данный момент удерживают систему от приостановки.
2. Использование Python с D-Bus
Если вам нужно более сложное управление, вы можете использовать Python для прямого взаимодействия с D-Bus. Это позволяет реализовать функцию приостановки через вызовы Inhibit()
и UnInhibit()
.
Примерный код Python может выглядеть следующим образом:
import subprocess
import dbus
def inhibit():
session_bus = dbus.SessionBus()
manager = session_bus.get_object('org.gnome.SessionManager', '/org/gnome/SessionManager')
manager.Inhibit("my_compilation", "Compiling kernel")
def unInhibit():
session_bus = dbus.SessionBus()
manager = session_bus.get_object('org.gnome.SessionManager', '/org/gnome/SessionManager')
manager.UnInhibit("my_compilation")
inhibit()
subprocess.call(["make"]) # Запустите вашу команду компиляции здесь
unInhibit()
3. Использование расширений GNOME
Если вам нравится графический интерфейс, вы можете рассмотреть использование расширений GNOME, таких как Caffeine или Espresso. Эти расширения позволяют временно отключать функции приостановки и управления экранами через удобный интерфейс.
-
Caffeine: Ссылка на расширение
-
Espresso: Ссылка на расширение
Эти расширения позволяют установить таймеры и другие параметры, что может быть удобно для управления приостановкой в зависимости от ваших потребностей.
4. Адаптация у вашего shell
Можно обернуть вашу команду в функции оболочки, которые будут временно отключать автоматическую приостановку. Примерный код:
disable_autosuspend() {
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
}
enable_autosuspend() {
gsettings reset org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout
}
make() {
disable_autosuspend
# Здесь ваша команда компиляции
command_to_compile
enable_autosuspend
}
Заключение
Вышеуказанные методы обеспечивают надежные способы предотвращения автоматической приостановки системы GNOME во время длительных операций, таких как компиляция. Выберите подходящий способ в зависимости от ваших предпочтений, и завершите сборку без каких-либо прерываний. Важно помнить о влиянии на энергопотребление и использовать эти решения только на период выполнения ресурсоемких задач.