请注意,我从 SO 复制了这个问题,因为我知道 ServerFault 更适合解决此类问题(https://stackoverflow.com/questions/5159220)
你好
我们遇到了一个非常奇怪的问题,让我们抓狂。有时,我们的文件共享 PC 上新创建的文件会在一段时间内“消失”。要重现问题,您至少应该有两台计算机,分别拨打它们alpha
和。在PCbeta
上创建文件共享()并从PC运行此 PowerShell 脚本:beta
\\beta\share\bug
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
。 错误也可以在 上重现Windows 7
(在两个操作系统上都SMB 2.0
安装了)
请注意,您无法alpha
在 Windows 资源管理器中实时查看 PC 上的目录内容,因为如果您在资源管理器中打开此目录,则不会发生错误!因此,请确保在尝试重现错误之前关闭所有此类窗口。每次重新启动脚本后,您都应手动从共享中删除所有已创建的文件(因为脚本相当愚蠢,并且总是从 0.txt 开始)。
目前,我们针对此问题有两种解决方法:
- 如果客户端看到这种情况,它会在有问题的目录中创建一些临时文件 - 之后这些文件就会神奇地出现。
- 禁用 SMB 2.0:http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
是否有人发现过类似的问题并能解释它为什么会发生以及如何“正确修复”它?
谢谢
答案1
我们目前的解决方案是:禁用 SMB 2.0(http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm)