监控文件服务器的瞬时文件锁定

监控文件服务器的瞬时文件锁定

我有一个 IIS web 服务(商业产品),它使用 UNC 将文件写入远程 Windows 文件服务器。

有时,尤其是在批量写入大量小文件时,该过程会失败。事件日志显示该过程失败,原因是“该过程无法访问该文件,因为它正在被另一个过程使用。”

当我去查看该文件时,无论是什么锁定它都不再锁定它,并且我可以毫无问题地对其进行写入。

因此有某种东西暂时锁定了该文件。

我不能使用进程监视器、OpenFiles 等,因为我需要在问题随机且暂时发生时捕获它。

我无法监控特定文件,因为每次 webservice 都会写入全新的文件。但它们会被写入特定的顶级文件夹和随机子文件夹。

它听起来很像防病毒软件,但我们的 McAfee 在所有相关机器上都禁用了 OnAccess 扫描。

是否可以在服务器上运行某些程序来监视文件锁失败错误/事件并在发生时捕获进程信息?

我如何才能捕捉到哪个进程在写入文件时暂时锁定了文件?

答案1

我认为您应该考虑在文件服务器上使用 procmon,并采用以下设置:

文件 -> 备份文件 -> “使用名为:”的文件并选择具有足够可用磁盘空间的路径。(通过使用备份文件,您可以避免填满服务器的虚拟内存)。

过滤器:创建一个或多个过滤器以匹配包含文件的文件夹或根目录(通常是“路径”、“开头为”小路

过滤器 -> 删除已过滤的事件

然后,开始捕获并查看过滤器是否正常工作。您可以根据事件数量调整选项 -> “历史深度”。

答案2

编辑:我刚刚意识到这是在 Windows 上,我将把它修改为在 Windows 操作系统上运行的类似选项;稍后会更新

可能的 WIN 解决方案:

从 sysinternals 下载以下工具

https://docs.microsoft.com/en-us/sysinternals/downloads/handle

创建包含以下内容的批处理文件:

@ECHO OFF
:loop
  cls
  handle -u >> output.txt
  timeout /t 1 > NUL
goto loop

在放置 sysinternal 句柄的同一位置运行批处理文件,它将每秒打印所有打开的文件及其进程,因此在执行文件传输时运行批处理文件,然后使用 CTRL+C 手动将其终止。仔细检查日志以查找故障进程

可能的 UNIX 解决方案:

在进行文件传输之前,请在故障机器上执行此命令:

nohup watch -n 1 lsof | grep FILENAME_HERE >> /path/to/log/log.txt &

“nohup” :使命令在后台运行,因此它将一直运行,直到您手动终止它

“watch -n 1” :每秒运行一次此命令

“lsof” :列出所有打开的文件

“grep” :过滤 lsof 的结果

“>>” :管道输出并附加到文件

& :运行命令并返回到 cmd 提示符

因此,您启动此命令,然后开始传输,如果您不确定,可以删除 grep 部分,但这会使查看日志变得有点困难。虽然您可以 grep 日志以查找失败的文件并找到正在使用它的进程。如果您对其中任何一项不确定,请告诉我

完成后记得手动终止进程

ps -aux | grep 监视

找到 pid 并运行

杀死$pid

相关内容