Я использую powershell для записи и чтения файлов журнала.
Один сценарий создает файл журнала с помощью Add-Content. Другой скрипт следит за файлом журнала, используя Get-Content -Wait. Кажется, это должно быть довольно надежно.
Однако писатель часто не может писать, а читатель часто не может читать и сдается. Я могу только предположить, что эти две команды не открывают файл с соответствующими флагами доступа, и поэтому они борются друг с другом.
Вот неприятный маленький скрипт, который демонстрирует проблему с двумя заданиями в одном процессе, хотя то же самое происходит между разными процессами powershell:
$writer = start-job -ScriptBlock {
foreach($i in 1..500)
{
"$i" | Add-Content "c:\temp\blah.txt"
Sleep -Milliseconds 10
}
}
$reader = start-job -ScriptBlock {
Get-Content "c:\temp\blah.txt" -wait
}
while($writer.State -eq "Running")
{
Sleep 1
}
Sleep 2
"Checking writer"
receive-job $writer
"Checking reader"
receive-job $reader
remove-job $writer -force
remove-job $reader -force
На моем компьютере с Windows 7 x64 с Powershell 3 ISE я обычно получаю много ошибок записи:
Checking writer
The process cannot access the file 'C:\temp\blah.txt' because it is being used by another process.
+ CategoryInfo : ReadError: (C:\temp\blah.txt:String) [Get-Content], IOException
+ FullyQualifiedErrorId : GetContentReaderIOError,Microsoft.PowerShell.Commands.GetContentCommand
+ PSComputerName : localhost
И тогда в читаемом файле есть пробелы:
Checking reader
...
23
24
25
54
55
56
...
Обратите внимание, что это проблема, отличная от обсуждаемой здесь: Get-Content -wait не работает, как описано в документации и здесь: https://social.technet.microsoft.com/Forums/windowsserver/en-US/e8ed4036-d822-43d3-9ee5-dd03df3d9bfc/why-doesnt-wait-work-and-why-doesnt-one-sem-to-care?forum=winserverpowershell файл, который не закрывается между записями.
Есть ли способ использовать Get-Content и Add-Content, как это, или я должен отказаться и использовать что-то еще для чтения и записи файлов журнала?