我们面临着非常奇怪的问题,这让我们发疯了。有时,我们的文件共享 PC 上新创建的文件在一段时间内“不存在”。要重现问题,您应该至少拥有两台计算机,调用它们alpha
并beta
. beta
在PC ( )上创建文件共享\\beta\share\bug
并从 PC 运行此 PowerShell 脚本alpha
:
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!
我们发现该错误是由枚举正在创建新文件的共享目录引起的。在Python
调用os.listdir('//beta/share/bug')
以重现错误。在C#
:Directory.GetDirectories(@"\\beta\share\bug")
。您甚至可以简单地通过 shell 导航到共享目录并调用ls
或dir
.
发现错误Windows Server 2008 R2
请注意,您不能alpha
在 Windows Explorer 中实时查看 PC 上的目录内容,因为如果您在 Explorer 中打开此目录,则不会出现错误!因此,请确保在尝试重现错误之前关闭所有此类窗口。每次脚本重新启动后,您应该手动从共享中删除所有已创建的文件(因为脚本相当愚蠢并且总是从 0.txt 开始)。
对于这个问题,我们目前有 2 个解决方法:
- 如果客户看到这种情况,它会在有问题的目录中创建一些临时文件 - 在这些文件神奇地出现之后。
- 禁用 SMB 2.0:http ://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
有没有人发现过类似的问题并且可以解释它为什么会发生以及如何“正确修复”它?
谢谢