在 Windows 10 上cmd.exe
,我输入了一个format D: /P:3
命令来格式化我的 1TB 外部磁盘。该过程开始运行,我在 10 分钟左右完成 1% 后离开了我的计算机。
在 30 分钟时,我的电脑决定我什么都不做,然后让自己进入睡眠状态,从而中断了格式化过程。
我很不高兴。
此后,我应用了通常的方法来摄取咖啡因,并在我再次运行此过程时强制计算机保持清醒。但是,它在我的脑海中提出了一个在网上很难搜索到的问题:
为什么 Windows(或与此相关的任何操作系统)无法将打开的命令提示符应用程序的 shell 中正在运行的进程识别为保持清醒的正当理由?
看视频让事情保持清醒,在键盘上移动鼠标/打字让事情保持清醒......为什么不在用户打开的命令提示符应用程序中输入用户输入的命令?
是否有一些出色的逻辑支持排除这一点的原因,或者只是多年来通过继承延续下来的另一种愚蠢的设计选择?
因为在任何时候都有数十甚至数百个进程正在运行(尽管它们可能处于空闲状态)。通常,不能(可靠地)区分哪些进程应该让 PC 保持清醒。但是对于使用 PC 的人来说,这通常很容易——因为他们还有一条 PC 没有的信息:意图。他们知道他们为什么要这么做。
因此,程序本身负责抑制睡眠,而不是操作系统。视频、VoIP 通话、PowerPoint 幻灯片等等。基本系统工具(如
format
)可能跟不上这种变化。(A)第一个问题是:经过一段空闲时间后,计算机进入睡眠状态。
这一点也不稀奇。
Excel、Word 或任何可以运行的程序,所有进程都在运行。所发生的一切是 Windows 进入暂停,暂停(停止)正在运行的应用程序或进程。(Zoom、You Tube、视频除外)
当我挂起 Windows 时,我总是在 Windows 应用程序和 VMware(它挂起正在运行的机器)中看到这一点。
我在不使用计算机(或在暂停计时器间隔)和电池电量不足时都发生过这种情况。
Windows 暂停一切(有一些值得注意的视频/音频例外)。
这种情况是正常的。
(B)这里的另一个问题似乎是如何让计算机保持清醒。
这是通过电源管理完成的。
如果您的电池健康,请将空闲时间设置为休眠 1 或 2 小时。
如果插入交流电,请将空闲时间设置为从不。
我使用阈值电池管理,让我的电脑插上电源,将挂起设置为从不,它始终处于开启状态。
一般来说,如果没有做某事,就假设这不是一个深思熟虑的设计决定,而是缺乏它。有时可能是这样的功能被明确地排除在设计之外,但更常见的是它从来没有达到过“设计”——它可能在优先级列表中很靠后,它可能只在走廊里讨论过并被丢弃,否则它可能永远不会被提起。
但是,在这种情况下,“按设计”的功能与您的帖子最初假设的功能不同 - 操作系统不会尝试将特定事物识别为视频播放,它依赖于明确的信息来源(直接用户输入,或者一个告诉它保持清醒的程序)。
也就是说,程序通常必须告诉操作系统在某些特定操作发生时保持系统唤醒。例如,在 Windows 中,程序可以调用SetThreadExecutionState(),在 Linux 上,程序采用“挂起抑制剂”,在 Android 上,它使用“唤醒锁”。
对于没有被编程为正确使用操作系统设施的应用程序,Linux 附带了 CLI“包装器”工具,可以在运行主应用程序之前执行此操作。例如,代替
wget
您运行gnome-session-inhibit wget
,只要该程序正在运行,系统就不会挂起。(有点像“caffeinate”,但内联使用而不是外部开/关切换。)至于为什么在 cmd.exe 和 powershell 中没有使用唤醒锁——我们所能做的就是猜测和推测,但最可能的原因是从外部区分想要完成特定操作的命令会有些困难(例如格式,下载)从没有的命令(例如,如果你离开一个打开的
git log
运行并且它只是坐在那里)。图形应用程序也是如此——在必须保持唤醒状态的游戏和可以毫无问题地暂停的电子邮件应用程序之间没有明显的区别,尽管两者使用网络的速度相同;或者在必须保持清醒的视频播放器和可能被暂停的图片查看器之间,尽管两者都是全屏的。
我怀疑通常情况下,它会导致误报,导致系统在应该暂停时保持清醒,而您的投诉只会被其他人对 Windows 增加电费的投诉所取代。
(这已经是 Windows 10 的一个问题,因为它的内部 Windows 更新服务之一偶尔会获取唤醒锁并忘记释放它,导致系统永远不会进入睡眠状态,即使实际上没有执行任何操作。
但也要考虑功能的维护成本:使用显式唤醒锁定仍然更容易解决此类问题,因为修复只影响被破坏的特定程序——而如果操作系统有一些启发式方法来猜测或检测空闲/活动程序,任何修复某些程序检测的更改都可能会破坏其他程序的检测。)