私たちは非常に奇妙な問題に直面し、頭がおかしくなりました。ファイル共有 PC で新しく作成されたファイルが、一定期間「存在しない」場合がありました。alpha
問題を再現するには、少なくとも 2 台のコンピューターが必要beta
です。beta
PC ( ) でファイル共有を作成し、PC\\beta\share\bug
から次の 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")
。シェルを使用して共有ディレクトリに移動し、ls
またはを呼び出すこともできdir
ます。
バグが見つかりましたWindows Server 2008 R2
alpha
PC 上のディレクトリ コンテンツを Windows Explorer でリアルタイムで見ることはできないことに注意してください。これは、このディレクトリを Explorer で開くとバグが発生しないためです。そのため、バグを再現する前に、そのようなウィンドウをすべて閉じてください。スクリプトを再起動するたびに、既に作成されているすべてのファイルを共有から手動で削除する必要があります (スクリプトはかなり愚かで、常に 0.txt から開始されるため)。
現在、この問題には 2 つの回避策があります。
- クライアントがこの状況を見た場合、問題のあるディレクトリに一時ファイルを作成します - このファイルが魔法のように表示された後。
- SMB 2.0 を無効にします: http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
誰かが同様の問題を発見したことがあり、なぜそれが発生するのか、どのように「正しく修正」するのかを説明できますか?
ありがとう