Как Ubuntu определяет бездействие перед приостановкой?

Я установил его на "приостановить, когда неактивен" через 30 минут.

Как он определяет, является ли он неактивным? Это просто пользовательский ввод с клавиатуры / мыши?

Если я оставлю программу без работы - скажем, обработка видео, которая занимает много времени, приостановится ли она через 30 минут и остановит ли эту программу? Тот же вопрос для долгих загрузок, приостановится ли он на полпути.

1 ответ

Решение

Хороший вопрос. Давайте разберемся!

  1. Начиная с изучения опции "Приостановить, когда неактивен для",

    <property ...>Suspend when inactive for</property> ...
    <object ... id="combobox_sleep_ac">
    

    мы можем узнать, что он устанавливает ключ GSettings под названием sleep-inactive-ac-timeout:

    widget = GTK_WIDGET (gtk_builder_get_object (..., "combobox_sleep_ac")); ...
    g_object_set_data (G_OBJECT(widget), "_gsettings_key", "sleep-inactive-ac-timeout");
    

    Документация по этому ключу дает краткое описание:

    Время в секундах, в течение которого компьютер, подключенный к сети переменного тока, должен быть неактивен, прежде чем перейти в спящий режим. Значение 0 означает никогда.

    но все еще не объясняет, что означает "неактивный".

  2. В поисках sleep-inactive-ac-timeout приводит нас к демону настроек GNOME,

    timeout_sleep = g_settings_get_int (..., "sleep-inactive-ac-timeout");
    

    который периодически проверяет свойство сеанса GNOME, называемое Presence.status:

    result = g_dbus_proxy_get_cached_property (...->session_presence_proxy, "status");
    

    Если он обнаруживает, что статус неактивен, он переводит систему в спящий режим:

    idle_set_mode (..., GSD_POWER_IDLE_MODE_SLEEP);
    

    Поэтому нам нужно узнать, как GNOME Session решает, является ли система "бездействующей".

  3. Следуя назад, откуда GNOME Session обновляет значение Presence.status,

    gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, ...);
    

    мы можем видеть, что он использует IDLETIME счетчик от Xorg:

    if (... && strcmp (counters[i].name, "IDLETIME") == 0) {
        ...->counter = counters[i].counter;
    
  4. IDLETIME Поведение счетчика обобщено в сообщении в блоге автора GNOME Power Manager:

    gnome-power-manager использует в Xorg счетчик IDLETIME. Этот счетчик увеличивается только тогда, когда пользователь не перемещает мышь или нажимает некоторые клавиши. Когда пользователь что-то щелкает, IDLECOUNTER сбрасывается.

Это говорит нам о том, что Ubuntu определяет бездействие, измеряя количество времени, прошедшее с момента последнего нажатия клавиши или движения мыши. Загрузка процессора и сетевая активность не учитываются.

Другие вопросы по тегам