如果 CPU 使用率过高则阻止进入睡眠状态

如果 CPU 使用率过高则阻止进入睡眠状态

如果 CPU 活动量很高,有没有一种简单的方法可以防止 PC 进入睡眠状态?我需要整夜运行长时间的进程,因此我希望 PC 在进程运行时保持运行状态,没有任何用户活动,但是当处理完成后,PC 应该在睡眠超时后进入睡眠状态。

我可以从我的代码(理想情况下是 python)中调用具有“resetSleepTimer”函数的解决方案也是可以接受的。


A澄清以下是 WinEunuuchs2Unix 和 Joaquín Ayuso de Paúl 的评论:遗憾的是,您的解决方案仅在单个进程的情况下才有效,但我通常有多个进程在运行,持续时间可变,因此如果一个进程结束并重新启用短暂的睡眠超时,它将对仍在运行的其他进程造成影响。重置睡眠定时器函数,我的意思是定期调用某个函数来重置暂停计时器。我之前(已删除)提出的模拟用户输入的建议不起作用,因为它也会使屏幕保持打开状态。


编辑:OP 在评论中提到的要求:

这会让屏幕一直亮着吗?这不是我想要的。另外,屏幕保护程序的操作是否也会影响睡眠/挂起超时?

答案1

基于此线,您可以通过调用以下代码在程序运行期间禁用睡眠过程:通过 DBus 抑制空闲

org.freedesktop.ScreenSaver.Inhibit

或者你可以定期 ping 它:

org.freedesktop.ScreenSaver.SimulateUserActivity

如果您需要完全阻止计算机进入睡眠状态,您可以暂时禁用该行为(再次通过 dBus),然后恢复它。这将取消屏幕保护程序但不会让计算机进入睡眠状态:

  $ sudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'

答案2

通过以下方式了解您当前的睡眠设置:

$ gsettings list-recursively | grep sleep
org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'suspend'
org.gnome.settings-daemon.plugins.power button-sleep 'suspend'
org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 0
org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'suspend'

我的系统设置为永不进入睡眠状态,但如果您的系统设置为 5 分钟(300 秒),则它将如下所示:

org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 300

当你的 python 程序启动时发出以下命令:

gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0

当你的python程序结束时恢复以前的设置:

gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 300

您的屏幕保护程序设置有时相关:

$ gsettings list-recursively | grep top.screensaver
org.gnome.desktop.screensaver picture-opacity 100
org.gnome.desktop.screensaver logout-enabled false
org.gnome.desktop.screensaver lock-enabled false
org.gnome.desktop.screensaver logout-delay uint32 7200
org.gnome.desktop.screensaver embedded-keyboard-enabled false
org.gnome.desktop.screensaver primary-color '#023c88'
org.gnome.desktop.screensaver idle-activation-enabled true
org.gnome.desktop.screensaver secondary-color '#5789ca'
org.gnome.desktop.screensaver logout-command ''
org.gnome.desktop.screensaver color-shading-type 'solid'
org.gnome.desktop.screensaver embedded-keyboard-command ''
org.gnome.desktop.screensaver show-notifications false
org.gnome.desktop.screensaver picture-options 'zoom'
org.gnome.desktop.screensaver lock-delay uint32 0
org.gnome.desktop.screensaver show-full-name-in-top-bar true
org.gnome.desktop.screensaver picture-uri 'file:///usr/share/backgrounds/gnome/adwaita-lock.jpg'
org.gnome.desktop.screensaver status-message-enabled true
org.gnome.desktop.screensaver ubuntu-lock-on-suspend false
org.gnome.desktop.screensaver user-switch-enabled true

根据系统活动编辑脚本

OP 已明确需求。可以运行多个作业。第一个结束的作业将重新激活睡眠,这将阻止剩余作业完成。

缩小版这个脚本需要:

movie.sh状态显示2.png

  • 消除显示器的调暗/调亮
  • 删除要处理的选择性监视器列表
  • 删除对键盘/鼠标空闲的检查(gnome 使用它们来激活睡眠)
  • 大幅减少统计摘要屏幕或全部删除

然后需要将使用(键盘和鼠标未使用时间)的代码xprintidle删除并替换为:

$ uptime
 08:08:54 up 9 days,  3:38,  1 user,  load average: 0.30, 0.47, 0.71

打印 1 分钟、5 分钟和 15 分钟的平均负载。一旦 5 分钟或 15 分钟低于阈值,只需暂停系统即可。


开发测试

要开始测试,请在终端中运行以下命令:

$ while true ; do uptime; sleep 300; done
 08:20:36 up 9 days,  3:50,  1 user,  load average: 0.36, 0.50, 0.64

每五分钟将显示一次平均负载,让您了解应该暂停的阈值。


跟踪使用情况

程序实施后,您可能希望审核使用情况。用于跟踪暂停活动(省电?)这个脚本可用于:

$ suspendtime
Oct 31 05:55:19 to Oct 31 16:54:26 lasting 39,547 seconds
 (... SNIP ...)
Nov 08 07:24:31 to Nov 08 09:28:44 lasting 7,453 seconds
Nov 08 23:26:19 to Nov 09 07:38:50 lasting 29,551 seconds

Linux uptime 791,119 seconds (9 days, 3 hours, 45 minutes, 19 seconds)
18 Suspends 494,551 seconds (5 days, 17 hours, 22 minutes, 31 seconds)
Real uptime 296,568 seconds (3 days, 10 hours, 22 minutes, 48 seconds)

答案3

您可以使用 Keep.Awake python3 程序来完成您想要的操作。它将解决您的问题,而且它确实有效!

它将考虑 CPU 负载、用户活动和网络流量(三者的布尔或)。

您可以从这里获取它: https://launchpad.net/keep.awake

如果你想了解它的工作原理,它是用 python3 编写的。现在最高支持 Ubuntu 20.04

取自网页的示例用法:

作为后台服务运行,并在确定用户处于空闲状态之前将 15 分钟(900 秒)设置为用户活动空闲时间:

nohup ./keepawake.py -u 900 -r > /dev/null 2>&1 &

要作为后台服务运行并将最低 CPU 负载设置为 13%:

nohup ./keepawake.py -c 13 -r > /dev/null 2>&1 &

作为后台服务运行并将最小网络流量设置为 5KB(5120 字节):

nohup ./keepawake.py -s 5120 -r > /dev/null 2>&1 &

作为后台服务运行,并将计划设置为 1 小时后睡眠/挂起(仅当确定用户活动、CPU 和网络流量都处于空闲状态时才设置此值):

nohup ./keepawake.py -w 3600 -r > /dev/null 2>&1 &

一次性运行上述所有设置(网络、CPU、用户空闲、睡眠计划),并将日志文件路径设置为“/home/$USER/sleep/log/Keep.Awake/”,并显示详细输出:

nohup ./keepawake.py -s 5120 -c 13 -u 900 -w 3600 -l /home/$USER/sleep/log/Keep.Awake/ -v Detail -r > /dev/null 2>&1 &

答案4

我开发了一个脚本可以抑制高 CPU 百分比(可以设置百分比)、指定的打开窗口(您可以指定窗口的名称、应用程序的名称和特定应用程序的窗口数)或正在运行的音频。不幸的是,我不确定它是否适用于您的发行版。我的脚本使用psutilpython 库和systemd-inhibit,因此您可能需要systemd-inhibit在终端中运行该命令()以查看它是否有机会工作。(它应该列出延迟和阻止睡眠等的事情)。

希望对您有所帮助。如果有问题,请随时打开问题或在此处写下您的问题。

相关内容