我有一个 IIS 网络服务(商业产品),它使用 UNC 将文件写入远程 Windows 文件服务器。
有时,特别是在批量写入大量小文件时,该过程会失败。事件日志显示该进程因“该进程无法访问该文件,因为它正被另一个进程使用”而失败。
当我去查看文件时,无论锁定它都不再锁定它,我可以毫无问题地写入它。
所以有些东西暂时锁定了文件。
我不能使用 Process Monitor、OpenFiles 等,因为我需要在问题随机和暂时发生时发现它。
我无法监控特定文件,因为 Web 服务每次都会写入全新的文件。但它们被写入特定的顶级文件夹和随机子文件夹。
这听起来很像 AntiVirus,但我们的 McAfee 已在所有相关机器上禁用了 OnAccess 扫描。
可以在服务器上运行一些东西来监视文件锁定失败错误/事件并在它们发生时捕获进程信息吗?
如何在写入文件时捕获哪个进程暂时锁定文件?
我认为您应该考虑在文件服务器上使用 procmon,并使用以下设置:
File -> Backing Files -> "Use file named:" 并选择一个有足够可用磁盘空间的路径。(通过使用备份文件,您可以避免填满服务器的虚拟内存)。
过滤器:创建一个或多个过滤器以匹配包含文件的文件夹或根目录(通常为“路径”“开始于”路径)
过滤器 -> 删除过滤的事件
然后,开始捕获并查看您的过滤器是否正常工作。您可以根据事件的数量调整选项 - >“历史深度”。
编辑:我刚刚意识到这是在 Windows 上,我会将其修改为适用于 Windows 操作系统的类似选项;稍后会更新
可能的获胜解决方案:
从 sysinternals 下载以下工具
https://docs.microsoft.com/en-us/sysinternals/downloads/handle
创建一个包含以下内容的批处理文件:
在您放置 sysinternal 句柄的同一位置运行批处理文件,它将打印所有打开的文件并每秒列出进程,因此在进行文件传输时运行批处理文件,然后使用 CTRL+C 手动终止它。搜索日志以找到错误的进程
可能的 UNIX 解决方案:
在进行文件传输之前,请在故障机器上执行以下命令:
"nohup" : 使命令在后台运行,所以它会一直运行直到你手动杀死它
“watch -n 1”:每秒运行一次这个命令
"lsof" : 列出所有打开的文件
"grep" : lsof 的过滤结果
">>" : 管道输出并附加到文件
& :运行命令并返回到 cmd 提示符
因此,您启动此命令,然后开始传输,如果您不确定是否可以删除 grep 部分,但这会使通过日志变得更加困难。尽管您可以使用 grep 查找失败的文件的日志并找到正在使用它的进程。如果您对此有任何不确定,请告诉我
完成后,请记住手动终止该进程
ps-辅助 | grep 看
找到pid并运行
杀死$pid