在我的 Windows10 笔记本电脑上,我运行了一个简单的 USB 相机快照程序 commandcam.exe(来自https://batchloaf.wordpress.com/commandcam/),在控制台.cmd脚本中,有一行:
FOR /l %%i in (1,1,1000000) DO FOR /F "usebackq delims==" %%G IN (`c:\systools\date "+%%Y%%m%%d-%%H%%M%%S"`) DO commandcam /devnum 2 /filename %%G.bmp /quiet & sleep 55
我的 c:\systools 中的 date.exe 和 sleep.exe 是从http://unxutils.sourceforge.net基本上,commandcam 程序会创建类似 20210911-113214.bmp 的文件,并休眠 55 秒并重复。但每隔几小时到几天,我的脚本就会冻结一次,光标会闪烁。(这与您意外单击控制台中的某个位置以将其置于文本选择模式的问题完全无关。注意:我的光标总是闪烁)
我仔细检查了事件查看器中与开始冻结时间相对应的所有消息。未发现任何相关消息。使用 sysinternals 工具 pslist 检查了启动时间与该时间相对应的所有进程。仅发现了一个,即如下所示的新 cmd.exe(此处为 pid 22264):
cmd.exe (pid 16364)
conhost.exe
cmd.exe (pid 22264) <-- this one started when my cmd script froze
我注意到,当我的脚本运行时,父 cmd(16364)会生成 commandcam,它会拍摄相机照片并退出,然后 cmd 会生成 sleep;不会有新的 cmd 进程。当我看到这个新的 cmd 时,脚本会冻结。如果有帮助,以下是有关这个新 cmd 进程的更多信息:
pslist v1.28 - Sysinternals PsList
Copyright ⌐ 2000-2004 Mark Russinovich
Sysinternals
Process and thread information for <my laptop>:
Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
cmd 22264 8 1 136 83040 0:00:00.046 4:24:07.933
VM WS Priv Priv Pk Faults NonP Page
4194303 6856 83040 84512 2561 11 133
Tid Pri Cswtch State User Time Kernel Time Elapsed Time
19500 9 94 Wait:UserReq 0:00:00.000 0:00:00.031 4:24:07.933
我注意到它的私有内存有点高(83040 KB)。所以我用任务管理器检查了一下,结果显示:
内存活动私有 ws 12K;私有 ws 12K;共享 ws 6776K;分页池:133K;NP 池:11K;句柄:136
pslist 和 Windows 的任务管理器 (只有 12 KB) 之间有很大区别。我认为这是因为 pslist 显示虚拟私有内存,而任务管理器显示工作集。
我不知道我还能检查什么。“Wait:UserReq”进程状态正常。顺便说一句,我发现如果我使用 Process Explorer 并尝试检查这个新 cmd 进程的线程调用堆栈,该进程将消失并且 commandcam 将启动,然后休眠 55 秒,... 即一切都将恢复正常。我不知道为什么。这就像检查线程堆栈会触发某些事情并打破挂起。