Сценарий PowerShell для привязки файла журнала на нескольких удаленных серверах - PullRequest
0 голосов
/ 03 февраля 2019

Мне нужно отполировать этот скрипт.Мне нужно, чтобы он работал на нескольких (5 - у всех есть файл журнала в одном месте) систем Windows.Я с трудом пытаюсь понять, как убедиться, что я могу «привязать» журнал к записи на всех 5 серверах одновременно и вернуть «ОК»;прекратить работу только тогда, когда запись в журнале генерируется на всех 5 серверах, а не только, скажем, на 4 из них.

Вот что это должно сделать:

  1. Запуск службы,
  2. "Хвост" файла журнала
  3. Подтвердите, что файл журнала содержит запись ($waitfor)
  4. Как только запись журнала генерируется в завершении
$serviceB = "my application service"
$logfile2 = "F:\App\log\wrapper.log"
$waitFor = "[4.2.3.GA (build: SVNTag=JBoss_4_2]”

Write-Host "Starting $serviceB"
Start-Service $serviceB
Write-Host "Waiting for $waitFor in $logfile2"
while (!((Get-Content $logfile2 -Tail 30) | ? {$_ -match $waitFor})) {
    Start-Sleep -Seconds 5
}

Как я могу использовать цикл foreach для выполнения, скажем, хвоста и ожидания записи журнала на всех 5 удаленных системах в файле CSV?

1 Ответ

0 голосов
/ 03 февраля 2019

Проще говоря, вы не можете, не в одном сеансе, все сразу.Каждый журнал должен быть в своем собственном сеансе.Откуда я знаю, потому что я пробовал wayyyy слишком много времени, чтобы достичь этого.Ну, вы могли бы делать только один сервер за раз, и когда это будет сделано, переходите к следующему, используя цикл.

Вы можете использовать цикл for для обращения к каждому хосту сервера, но вам нужно получить отдельный экземпляр PowerShell для каждого из них.

Что ж, вы можете сделать это за один сеанс консоли, выполнив всего один сервер ввремя, дождитесь его завершения, дайте ему сообщение, и когда это будет сделано, перейдите к следующему с помощью цикла.Тем не менее, если для того, чтобы найти эту строку, требуется некоторое время, это выглядит как наблюдение за высыханием краски.

foreach ($RemoteHost in (Import-Csv -Path 'D:\Temp\serverlist.csv')) 
{
    # You code here
    Invoke-Command -ComputerName $RemoteHost -Credential 'domain\adminname' -ScriptBlock {
        # the rest of your code here:

    }
}

Поскольку вы говорите «удаленный хост», то это означает, что вам нужно включить PSRemoting для них, используя усилиеНеявное удаление сеансов и использование учетной записи, которая входит в локальную группу администраторов удаленного хоста.

Вы можете использовать -tail -wait и устранить необходимость в этом шаге Start-Sleep и захвата строки.

Использование -tail -wait покажет журнал при записи каждой строки, когда запись сделана.

Get-Content -Path $CurrentHostLog.FullName -Tail 0 -Wait 

Итак, хотя я не совсем уверен, почему вы хотите -следите за этим и наблюдайте за прокруткой этих журналов, так как вы ищете только простую строку

ИМХО, я бы посоветовал просто запустить каждую из них как фоновую работу параллельно, и эта работа предупредит вас;текст, электронная почта, предупреждение на экране и т. д., когда они возвращают результат, который вы после.

...