Пользователь
Логин:
Пароль:
Регистрация
Забыли свой пароль?

Поиск по сайту
 

 Расширенный поиск
Реклама

Как повысить отказоустойчивость системы OMNITRACKER средствами Windows

Может случиться так, что приложение OMNITRACKER даст сбой, и служа OtServer упадет, при этом администратор может об этом узнать уже после звонка группы мониторинга. Конечно только в том случае если оно есть, а что если ее нет?
В любом случае чтобы поднять службу нам нужно событие, подобные события записываются в лог 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.