我们遇到了非常奇怪的问题,让我们发疯。有时我们的文件共享PC上新创建的文件在一段时间内“缺席”。要重现问题,您应该至少有两台计算机,请将其称为alpha
和beta
。 beta
PC(\\beta\share\bug
)上创建文件共享,并从alpha
PC运行此PowerShell脚本:Windows文件共享:为什么有时候新创建的文件在某段时间内不可见?
param(
$sharePath="\\beta\share\bug"
)
$sharePC = ($sharePath -split '\\')[2]
$session = New-PSSession -ComputerName $sharePC
$counter = 0
while ($true) {
$fileName = $sharePath + "\$counter.txt"
Invoke-Command -Session $session -ScriptBlock {
param(
$fileName
)
"" > $fileName
} -ArgumentList $fileName
if (Test-Path $fileName) {
Write-Host "File $fileName exists" -fore Green
} else {
Write-Host "!!! File $fileName does NOT exist!" -fore Red
}
$counter = $counter + 1
Start-Sleep 2
}
启动此脚本后,你应该能够看到这些消息:
File \\beta\share\bug\1.txt exists
File \\beta\share\bug\2.txt exists
...
现在: 打开cmd.exe
并运行此命令:
if exist \\beta\share\bug\foo.txt echo 1
在此之后在约10秒钟,会看到以下消息:
!!! File \\beta\share\bug\3.txt does NOT exist!
!!! File \\beta\share\bug\4.txt does NOT exist!
我们已经发现这个bug是通过列举其中正在创建新的文件共享目录引起的。在Python
请致电os.listdir('//beta/share/bug')
重现一个错误。在C#
:Directory.GetDirectories(@"\\beta\share\bug")
。你甚至可以简单地导航到shell共享目录,并呼吁ls
或dir
。
错误是在Windows Server 2008 R2
注意发现,你不能alpha
在电脑上观看目录中的内容在Windows资源管理器中实时,因为如果你打开在资源管理器的bug这个目录就不会发生!因此,确保在尝试重现错误之前关闭所有这些窗口。每次脚本重新启动后,您应手动从共享中删除所有已创建的文件(因为脚本相当愚蠢,始终从0.txt开始)。
我们目前有2个解决方法针对此问题:
- 如果客户看到这种情况下,它会在有问题的目录中的一些临时文件 - 此文件后,奇迹般地出现。
- 禁用SMB 2.0:http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
是否有人曾经发现了类似的问题,可以解释它为什么会发生,以及如何“正确地解决”吗?
感谢
你看网络跟踪,看看这是怎么回事? – selbie 2011-03-02 08:52:54
不,不幸的是,我没有看过网络跟踪 – Roman 2011-03-02 16:08:01
我不认为网络跟踪会有所帮助。这似乎是服务器端的缓存问题。从Windows 2003到2012R2,我们遇到了完全相同的问题。看来SMB为创建它们的服务器显示了文件,但随后显示这些文件还不存在于查询它们的其他服务器。这很糟糕。 – Brain2000 2015-01-04 02:10:25