最近,我经常在 Windows 10 中使用命令提示符,运行 Node.js 和 Apache Tomcat 服务器之类的程序,我注意到一个奇怪的问题:程序时不时会停止响应(对于这两个程序,停止提供请求),因此我聚焦命令提示符窗口并按 Ctrl+C 来终止程序,打算重新启动它。然而,当我这样做时,程序会立即恢复,就像它被暂停或卡在调试断点上一样。
我注意到几个程序都存在这个问题 - 不仅仅是 Node 和 Tomcat - 我想知道这种情况是如何/为什么发生的以及如何阻止它发生 - 这对我来说是一个非常大的问题 - 我试图使用这两个服务器编写软件,但永远无法判断是我的代码坏了还是命令提示符冻结了。
答案1
这是一个相当老的问题,但我遇到了这个问题并找到了答案:命令提示符挂起直到按下键盘?
答案2
这是很常见的事情:
使用 WinPE 和基本命令提示符终端以及 PowerShell 或现代 .Net 5.0 控制台程序(任何东西)时也会发生这种情况。据我所知,这是 Windows 终端的一个错误,没有适当的解决方案,只有缓解问题的方法。
一个答案另一个问题(QuickEdit 模式挂起) 中有一条注释,描述了这个现象perfect:“我在 Windows 上已经看到这种情况 20 年了。它出现和消失了很多次……我认为是微软没有进行适当的回归测试,因为它每隔几年就会出现和消失”(gunslingor 2019 年 10 月 11 日 16:38)
这对系统管理员来说是一场灾难:
有时,当程序挂起或只是忙碌而没有输出文本时,你根本不知道——猜错了,在错误的时间按下了 CTRL+C,你可能会失去几小时的工作(或者更糟的是——如果您无法安装 Exchange Server,您可能会最终破坏公司的整个活动目录数据库——祝您以后找工作顺利)。
由于 QuickEdit 模式挂起很容易令人混淆,因此最好先确定您遇到的是哪种挂起。
如何判断是 CTRL-C 挂起还是 QuickEdit 挂起:
QuickEdit 模式挂起是仁慈的,因为这些控制台挂起实际上并不会挂起程序——当您取消挂起控制台输出时,当控制台赶上实际输出时,您会立即看到一堵新行墙。
要取消挂起,如果您懒得按 ESC,或者如果您小心谨慎,可以调整控制台大小。大多数键都不起作用,如果控制台没有挂起,RMouse 可能会将剪贴板粘贴到控制台中(这可能是灾难性的),enter 可能会执行默认输入命令(如果没有挂起)或丢失有价值的剪贴板信息(因为它在标记时“复制”),ESC 虽然通常是安全的,但可能会向程序发出中止命令。为了安全起见,请调整控制台大小。
如果仍然挂起,你可能有一个 CTRL-C 挂起,以下是帮助验证的缓解措施:
当它是“CTRL+C”来解除挂起时,它只会从它停止的地方恢复——如果它没有挂起,你就会中止你正在做的事情,这可能是灾难性的。如上所述,似乎没有解决办法,只是了解你的东西并先发制人地采取措施,这样你就可以更好地判断它是否挂起:
1a)通过输出到控制台来“注释”你的脚本和程序:
对于您自己的批处理文件和脚本,请将 REM/等注释转换为 ECHO 输出。对于程序,// Write image to share folder:
请考虑将其替换为Console.WriteLine($"Writing image to share, this should have no output for 10-20 minutes, the current time is {timeNow}".);
1b)启用详细模式:
当您不使用自己的脚本和程序时,请查看是否有详细选项。这因程序和上下文而异,但当您直接在控制台中工作而不是通过自己的自动化脚本和程序工作时,启用程序的详细输出(通常只需添加“-v”)会很有帮助。
2)了解你的时间安排(> 30秒):
第一次做某件事总是最难的。但是一旦你第一次做了,在你的文档中,任何超过 30 秒的时间段都应该写下来。如果它因某些因素而有所不同,请尝试列出两个例子:
Imaging HDD's of ~12 gigs, expect 3 minutes of no output.
Imaging HDD's of ~20 gigs, expect 8 minutes of no output.
3)行动前先注意。
在一张纸上写下你正在运行的内容、运行了多久、花费了多长时间、你认为应该花费多长时间、如果按 CTRL+C 键运行进程,你期望会发生什么以及你需要做什么才能恢复它从现在开始如果是这样的话。最重要的是,如果你毁掉了你现在正在做的一切,修复、恢复或重置它需要花费多少时间?
有时在错误的时间按下 CTRL-C 可能会产生不可预知的后果。如果您正在执行一个复杂的脚本,程序终止(即使中止)也会导致计算机重新启动。冻结的更新可能会对操作系统造成毁灭性的后果。您确定不想花 30 分钟处理其他事情以确保它真的冻结后再尝试解冻吗?如果您不确定,请不要立即测试。
4) 确保已选择窗口。
这听起来很蠢,但这是最容易犯的错误,特别是在安装到虚拟机或通过 RDP 的机器上时,即使只打开了一个窗口,也请单击终端的顶部栏并尝试在按 CTRL-C 之前拖动它(但在尝试调整窗口大小以检查 QuickEdit 模式是否冻结之后)。
我们需要避免两个常见的陷阱:
- 您的 RDP 会话可能被冻结——按 CTRL-C(与窗口交互)可能有助于它重新建立连接,并且 CTRL-C 可能会被错误地传递。
- 更重要的是,当您第一次按下 CTRL-C 时,控制台可能不会出现挂起状态——但这并不是因为它仍然挂起——只是因为它在一个漫长的过程中间冻结而没有输出。想象一下:您认为窗口已被选中——您按下 CTRL-C 但什么也没发生,您认为窗口可能未被选中,因此快速选择它并再次按下 CTRL+C。然后您意识到它一开始就被选中了——并且被冻结了——尽管您使用第一个 CTRL-C 将其解冻,但由于您之后再次按下 CTRL-C,因此其进程将被中止。现在您掌面。
底线是:当你按下 CTRL-C 时,你要确保它已经注册,并且你只做一次--不要怀疑窗口在按键过程中是否被选中并有响应。如果第一次按下 CTRL-C 后没有响应,请在纸上记录时间,并根据之前重复相同过程的计时记录,记下完成当前过程需要多长时间(假设它刚从 0 秒开始),在此之前不要再试(以防万一,请多留一点时间)。
答案3
检查电脑的能源选项中是否没有“经济模式”,如果有,则将其更改为“最大性能”。