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