В любом случае чтобы поднять службу нам нужно событие, подобные события записываются в лог windows. Поэтому отловить такое событие и выполнить запуск службы не составляет никакой проблемы.
Для начала давайте посмотрим наличие данных событий в логах системы, для этого напишем свой XML фильтр в Event Views, который потом будем использовать в событии на исполнение.
Переходим на закладку XML, и добавляем код:
Код
<QueryList> <Query Id="0" Path="Application"> <Select Path="Application">*[EventData[Data and (Data='OtServer.exe') ]] and *[System[Provider[@Name='Application Error'] ]] </Select> <Select Path="Application">*[EventData[Data and (Data='OtEmail.exe') ]] and *[System[Provider[@Name='Application Error'] ]] </Select> <Select Path="Application">*[System[Provider[@Name='OTEmailGatewayService'] ]] and *[System[EventID[@Qualifiers='49152'] and EventID=1000 ]]</Select> </Query> </QueryList> |
Получаем все события:
Если в данный список ничего лишнего не попадает, самое время написать свой скрипт, который будет поднимать службы приложения. Причем поднимать службы не только OtServer, но также и Email, в довесок будем поднимать все остальные службы, с проверками.
В моем случае мы будем поднимать службы с проверками запуска центральной службы, если служба OtServer запущена, то это еще не значит, что можно запускать остальные. Как только в лог фале появится информация Welcome, значит сервер готов для запуска дочерних служб.
Для этого дополнительно воспользуемся средствами системы «PowerShell» напишем свой скрипт.
Код
# OtServiceReanimator v1.0 # ServiceCall.RU # ------------ Настройки ------------ $_ServerName = "localhost" $_LogFile = "\\" + $_ServerName + "\c$\APPDATA\Logs\ot-" + (Get-Date -uformat "%Y-%m-%d") + ".log" ; $_MainServicesName = "OmniTrackerServer" ; $_DependentServicesName = "OTEmailGatewayService", "OtScheduler", "OMNITRACKERIndex" ; #------------------------------------------------------------------------------------------- #------------------------------------------------------------------------------------------- function GetServices { param ($ServicesName, $FilterStatus="") ; foreach ($ServiceName in $ServicesName) { $Service = Get-Service -ComputerName $_ServerName -ServiceName $ServiceName ; if ( ($FilterStatus -eq "") -or ($Service.Status -eq $FilterStatus) ) { $result += @($Service.Name) ; } } return $result ; } function ActiveServices { param ($ServicesName, $Status, $FilterStatus="") ; foreach($ServiceName in $ServicesName) { $Service = Get-Service -ComputerName $_ServerName -ServiceName $ServiceName ; if ( ($FilterStatus -eq "") -or ($Service.Status -eq $FilterStatus) ) { if ($Status -eq "Running") { Log("Запуск сервиса: " + $ServiceName) ; $Service.Start() ; WaitServicesStatus -ServicesName $Service.Name -WaitStatus "Running" } elseif ($Status -eq "Stopped") { Log("Остановка сервиса: " + $ServiceName) ; $Service.Stop() ; WaitServicesStatus -ServicesName $Service.Name -WaitStatus "Stopped" } } } } function WaitServicesStatus { param ($ServicesName, $WaitStatus, $WaitTime = 10000, $IterationWaitTime = 100) ; do { $i++ ; if ( (GetServices -ServicesName $ServicesName -FilterStatus $WaitStatus).Count -lt $ServicesName.Count ) { $result = $false ; Log($ServicesName + " - еще переходят в статус " + $WaitStatus) } else { Log($ServicesName + " - перешли в статус " + $WaitStatus) $result = $true break ; } Start-Sleep -Milliseconds $IterationWaitTime ; } until ( $WaitTime -le ($i * $IterationWaitTime) ) } function WaitStringInFile { param ($File, $String, $ReadNumLastLine = 10, $WaitTime = 180000, $ReReadTime = 100) ; do { $i++ ; if( ($FileContent = Get-Content -Path $File -Tail $ReadNumLastLine) -like "*"+$String+"*" ) { $result = $true ; break ; } else { $result = $false ; } Start-Sleep -Milliseconds $ReReadTime ; } until ( $WaitTime -le ($i * $ReReadTime) ) } function Log ($ins_string) { $ResultString = (Get-Date -UFormat "%Y.%m.%d %H:%M") + " " + $ins_string + "." ; Write-Host $ResultString ; } #------------------------------------------------------------------------------------------- #clear if ( $args[0] -eq "restart" ) { Log("Режим восстановления") ; ActiveServices -ServicesName $_DependentServicesName -Status "Stopped" -FilterStatus "Running" ActiveServices -ServicesName $_MainServicesName -Status "Stopped" -FilterStatus "Running" ActiveServices -ServicesName $_MainServicesName -Status "Running" Log("Ожидание появления строки в логе...") ; WaitStringInFile -File $_LogFile -String " Welcome to OMNITRACKER " -WaitTime 60000 -ReReadTime 100 -ReadNumLastLine 10 ActiveServices -ServicesName $_DependentServicesName -Status "Running" } else { if( ($StoppedMainServices = GetServices -ServicesName $_MainServicesName -FilterStatus "Stopped").Count -gt 0 ) { Log("Режим восстановления") ; Log("Главные сервисы не запущены: " + $StoppedMainServices) ; ActiveServices -ServicesName $_DependentServicesName -Status "Stopped" -FilterStatus "Running" ActiveServices -ServicesName $_MainServicesName -Status "Stopped" -FilterStatus "Running" ActiveServices -ServicesName $_MainServicesName -Status "Running" Log("Ожидание появления строки в логе...") ; WaitStringInFile -File $_LogFile -String " Welcome to OMNITRACKER " -WaitTime 180000 -ReReadTime 100 -ReadNumLastLine 10 ActiveServices -ServicesName $_DependentServicesName -Status "Running" } elseif( ($StoppedDependentServices = GetServices -ServicesName $_DependentServicesName -FilterStatus "Stopped").Count -gt 0) { Log("Доп сервисы не запущены: " + $StoppedDependentServices) ; ActiveServices -ServicesName $StoppedDependentServices -Status "Running" } } |
Создайте файл с содержимым кода с расширением .ps1
Теперь откройте Task Scheduler и выполните следующие настройки:
В поле Add arguments укажите путь до файла
-f "C:\Program Files (x86)\OMNITRACKER\ot\Name.ps1"
После этого повторите эту комбинацию на всех APP серверах, это позволит запускать приложение автоматически.
Для штатного перезапуска системы можете настроить запуск этого же файла но с кличем Restart
-f "C:\Program Files (x86)\OMNITRACKER\ot\Name.ps1" restart
Надеюсь, что данная информация кому ни будь пригодится, при администрировании приложения OMNITRACKER.