如何找到阻止睡眠的程序?

如何找到阻止睡眠的程序?

我注意到最近我的笔记本电脑在配置的 X 分钟不活动时间后不会像过去那样进入睡眠/锁定状态。我怀疑是某个程序(如媒体播放器)阻止了它进入睡眠状态。我没有运行任何媒体播放器,那么如何才能找到阻止它进入睡眠状态的程序?

如果我合上盖子,它就会进入睡眠状态。但我还希望它在 X 分钟不活动后进入睡眠状态。

更新:升级到 Ubuntu 18.04,并默认启用 Gnome 和 Wayland。

答案1

我想我已经明白了。

我用了:

dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.GetInhibitors

获取抑制剂列表,例如:

array [
   object path "/org/gnome/SessionManager/Inhibitor71"
   object path "/org/gnome/SessionManager/Inhibitor72"
]

然后我做了:

dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager/Inhibitor71 org.gnome.SessionManager.Inhibitor.GetAppId

返回:

string "firefox"

Firefox 似乎阻止了它。现在,当 YouTube 正在播放时,它似乎会阻止睡眠。

答案2

根据 Alexis Wilke 的回答,我创建了一个 python 解决方案:

https://pypi.org/project/list-session-inhibitors/

我已经激活了 Caffeine 插件和 Franz 消息应用程序,并且在不同的帐户中运行两个 Google Meet,一个在 Firefox 中,一个在 Chrome 中。

我的脚本产生如下输出:

tim@indigo:~$ inhibitors list
Listing inhibitors reported by dbus:
Inhibitor: /tmp/.mount_Franz-GuOnG8/franz Video Wake Lock
Inhibitor: /usr/bin/google-chrome-stable Video Wake Lock
Inhibitor: /usr/bin/google-chrome-stable WebRTC has active PeerConnections
Inhibitor: user Inhibit by Caffeine
Inhibitor: firefox audio-playing
Inhibitor: /usr/bin/google-chrome-stable Video Wake Lock
tim@indigo:~$ 

有一种替代方案systemd-inhibit --list,但不太有帮助:

systemd-inhibit --list
WHO                            UID  USER PID   COMM            WHAT                                                     WHY                                                       MODE 
ModemManager                   0    root 2222  ModemManager    sleep                                                    ModemManager needs to reset devices                       delay
NetworkManager                 0    root 1912  NetworkManager  sleep                                                    NetworkManager needs to turn off networks                 delay
UPower                         0    root 2654  upowerd         sleep                                                    Pause device polling                                      delay
Unattended Upgrades Shutdown   0    root 2449  unattended-upgr shutdown                                                 Stop ongoing upgrades or perform upgrades before shutdown delay
GNOME Shell                    1000 tim  5039  gnome-shell     sleep                                                    GNOME needs to lock the screen                            delay
Telepathy                      1000 tim  5156  mission-control shutdown:sleep                                           Disconnecting IM accounts before suspend/shutdown...      delay
franz                          1000 tim  69469 franz           sleep                                                    Application cleanup before suspend                        delay
gnome-tweak-tool-lid-inhibitor 1000 tim  5325  python3         handle-lid-switch                                        user preference                                           block
tim                            1000 tim  5255  gsd-media-keys  handle-power-key:handle-suspend-key:handle-hibernate-key GNOME handling keypresses                                 block
tim                            1000 tim  5020  gnome-session-b shutdown:sleep                                           user session inhibited                                    block
tim                            1000 tim  5255  gsd-media-keys  sleep                                                    GNOME handling keypresses                                 delay
tim                            1000 tim  5257  gsd-power       sleep                                                    GNOME needs to lock the screen                            delay

答案3

Mitar 绝对是正确的答案,您可以使用 dbus 来检索信息。

有趣的是,Firefox 中的某些选项卡会产生问题,而其他选项卡则不会。根据我现在的测试,我可以说它足够智能,可以根据页面内容添加/删除抑制功能 — 例如,在 YouTube 上,如果您有一段视频,它会抑制屏幕保护程序。

我写PHP 脚本为了将抑制剂列为简单列表。我敢打赌 Python 中有一些工具/库可以做到这一点(因为许多操作系统代码都使用该语言),但不幸的是我对 Python 的了解还不够。

将以下内容复制到文件中,~/bin/inhibitors然后使用 使其可执行chmod 755 ~/bin/inhibitors。现在您可以在控制台中输入:inhibitors您将获得阻止操作系统进入睡眠状态的工具列表。

#!/usr/bin/php
<?php
$list = `dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.GetInhibitors`;

$l = explode("\n", $list);

$found = false;
foreach($l as $a)
{
    $a = trim($a);
    if($found)
    {
        if($a == "]")
        {
            break;
        }
        if(substr($a, 0, 13) == 'object path "')
        {
            $inhibitor = substr($a, 13, strlen($a) - 14);

            $info = `dbus-send --print-reply --dest=org.gnome.SessionManager $inhibitor org.gnome.SessionManager.Inhibitor.GetAppId`;

            $names = explode("\n", $info);
            $n = trim($names[1]);
            if(substr($n, 0, 8) == 'string "')
            {
                $name = substr($n, 8, strlen($n) - 9);

                echo $inhibitor, " ", $name, "\n";
            }
        }
    }
    elseif($a == "array [")
    {
        $found = true;
    }
}

以下是输出示例:

$ inhibitors
/org/gnome/SessionManager/Inhibitor2414 firefox
/org/gnome/SessionManager/Inhibitor2415 org.gnome.Totem

在这种情况下,Firefox 和 Totem 会阻止我的屏幕保护程序。

答案4

如果您打开终端窗口,您可以输入“top”来查看所有正在运行的进程的不断更新的列表。其中一个繁忙的后台进程正在阻止您的笔记本电脑进入睡眠状态。要查看静态列表,请输入“ps aux”。然后,您可以查看它们的进程标识号。这将允许您对任何可疑进程使用“sudo kill pidnumber”,以查看停止它是否会让您的笔记本电脑进入睡眠状态(在其超时期限之后)。一旦您确定了有问题的进程,您就可以做出明智的决定,确定该进程对您是否重要。

相关内容