ubuntu 如何在挂起之前确定不活动?

Jaz*_*azz 15 suspend

我已将其设置为 30 分钟后“不活动时暂停”。

它如何确定它是否处于非活动状态?它只是用户通过键盘/鼠标输入吗?

如果我让一个程序继续工作——比如说处理一个需要很长时间的视频,它会在 30 分钟后暂停并停止该程序吗?长时间下载的相同问题,它会中途暂停。

ænd*_*rük 21

好问题。让我们一探究竟吧!

  1. 首先调查“不活动时暂停”选项,

    <property ...>Suspend when inactive for</property> ...
    <object ... id="combobox_sleep_ac">
    
    Run Code Online (Sandbox Code Playgroud)

    我们可以了解到它设置了一个名为的 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");
    
    Run Code Online (Sandbox Code Playgroud)

    此密钥的文档提供了简要说明:

    使用交流电源的计算机在进入睡眠状态之前需要处于非活动状态的时间(以秒为单位)。值 0 表示从不。

    但仍然没有解释“不活动”是什么意思。

  2. 搜索sleep-inactive-ac-timeout使我们GNOME设置守护进程

    timeout_sleep = g_settings_get_int (..., "sleep-inactive-ac-timeout");
    
    Run Code Online (Sandbox Code Playgroud)

    它会定期检查GNOME Session 的一个名为 的属性Presence.status

    result = g_dbus_proxy_get_cached_property (...->session_presence_proxy, "status");
    
    Run Code Online (Sandbox Code Playgroud)

    如果发现状态为空闲,则使系统进入睡眠状态

    idle_set_mode (..., GSD_POWER_IDLE_MODE_SLEEP);
    
    Run Code Online (Sandbox Code Playgroud)

    所以我们需要了解 GNOME Session 如何判断系统是否“空闲”。

  3. 从 GNOME Session更新的值向后Presence.status

    gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, ...);
    
    Run Code Online (Sandbox Code Playgroud)

    我们可以看到它使用IDLETIME来自 Xorg的计数器:

    if (... && strcmp (counters[i].name, "IDLETIME") == 0) {
        ...->counter = counters[i].counter;
    
    Run Code Online (Sandbox Code Playgroud)
  4. IDLETIME计数器的行为总结在博客文章由GNOME电源管理器的作者:

    gnome-power-manager 在 Xorg 中使用一个名为 IDLETIME 的计数器。仅当用户不移动鼠标或单击某些键时,此计数器才会增加。当用户点击某物时,IDLECOUNTER 被重置。

这告诉我们 Ubuntu 通过测量自上次击键或鼠标移动以来经过的时间量来确定不活动。CPU 使用率和网络活动不考虑在内。