“进程监视器”的最大历史深度为 1.99 亿个事件。我需要记录大约 10 倍于此的数据。我不介意拆分数据,例如每小时一个新的数据集。有人知道怎么做吗?我猜是一个批处理文件,备份文件将进入按顺序命名的文件夹。有没有办法检测进程监视器是否已填满其历史深度以将其杀死,或者我只需要休眠?
答案1
是的,你必须编写脚本。我以前用 Procmon 做过类似的工作,但我的目标并不是捕获数十亿个事件。不过,这应该对你有帮助,除非你需要有人为你编写脚本:
创建每 5 分钟运行一次的 VBscript。任务计划程序可以帮助您实现这一点。
如果这是脚本第一次运行,则像这样启动 Procmon:
objShell.Run "Cmd /C " & PRM_ProcMonExe & " /quiet /minimized /AcceptEula /backingfile " & PRM_PMLDir & "Procmon" & subDir & ".pml"
然后在后续运行脚本时,测量 subDir 中所有 *.pml 文件的总大小。
If ProcMonTriggered = True And ProcMonTerminated = False Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(PRM_PMLDir)
Set objFiles = objFolder.Files
For Each objItem In objFiles
If UCase(objFSO.GetExtensionName(objItem.Name)) = "PML" Then
totalPMLSize = totalPMLSize + objItem.Size
End If
Next
If totalPMLSize > (PRM_PMLMaxSize * 1073741824) Then
NQExt.CreateEvent PRM_TriggeredSev, "ProcMon Terminated", "AKP_NULL", gstrEventTarget, 0.0, "Process Monitor was terminated because the PML file reached the limit of " & PRM_PMLMaxSize & "GB." & vbCrlf & "Process Monitor cannot be triggered again until this script is re-deployed." & vbCrlf & "Please see KB " & PRM_KBArticle, "", 0, 0
Set objShell = CreateObject("WScript.Shell")
objShell.Run "Cmd /C " & PRM_ProcMonExe & " /AcceptEula /terminate"
End If
If isObject(objFiles) Then Set objFiles = Nothing
If isObject(objFolder) Then Set objFolder = Nothing
If isObject(objShell) Then Set objShell = Nothing
If isObject(objFSO) Then Set objFSO = Nothing
ProcMonTerminated = True
End If
这不是专门针对您的情况而定制的。您必须对其进行调整。这是我很久以前为稍微不同的目的而写的东西。您要做的就是,如果自上次运行脚本以来,子目录中所有 *.pml 文件的大小加起来没有增加……那么您就知道是时候终止 Procmon 并启动一个新实例了。
重点是您必须使用 /terminate 参数正常终止 Procmon,而不仅仅是终止进程,否则日志将损坏且无法读取。
然后在新的 subDir 中启动 procmon 的新实例。发挥创造力,您可以创建具有增量名称的子目录,例如 subdir1、subdir2、subdir3 等。
编辑:另外,我以前从未运行过 Procmon 处理 2 亿个事件,所以我不知道它在达到 1.99 亿个事件后是否只是停留在那里什么也不做,或者它是否完全关闭。如果是后者,那么你的工作就简单多了。只需检查 Procmon.exe 是否仍在运行。如果没有,那么你就知道是时候在新的子目录下再次启动它了。
编辑:是的,我认为它一旦达到历史深度就会开始滚动......文件大小也是如此。