Мы столкнулись с очень странной проблемой, которая сделала нас сумасшедшими. Иногда недавно созданные файлы на нашем ПК с файловым доступом "отсутствовали" в течение некоторого периода времени. Чтобы воспроизвести проблему, у вас должно быть как минимум два компьютера, назовите их alpha
и beta
. Создайте общий ресурс файла на beta
ПК (\\beta\share\bug
) и запустите этот PowerShell script с 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
}
После запуска этого script вы должны будете видеть эти сообщения:
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
ПК в проводнике Windows в режиме реального времени, потому что если вы откроете этот каталог в Explorer, ошибка не возникнет! Поэтому убедитесь, что вы закрываете все такие окна перед попытками воспроизвести ошибку. После каждого перезапуска script вы должны вручную удалить все уже созданные файлы из share (потому что script довольно глупо и всегда начинается с 0.txt).
В настоящее время у нас есть 2 способа обхода проблемы:
- Если клиент видит эту ситуацию, он создает временный файл в проблемном каталоге - после этого появляются волшебные файлы.
- Отключить SMB 2.0: http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
Кто-нибудь когда-либо обнаружил подобную проблему и может объяснить, почему это происходит и как "правильно исправить" это?
Спасибо