Странная проблема с Windows Service - Service Timeing Out - PullRequest
1 голос
/ 10 апреля 2020

Привет, у меня есть часть устаревшего (VS2010) Windows Сервисный код, который я импортировал в VS2017 и вызывает у меня сильное разочарование. Этот код работал хорошо в течение последних 6 лет, однако, когда я выполняю установку и пытаюсь запустить службу, SCM возвращается с ошибкой тайм-аута. Код OnStart выглядит следующим образом:

Protected Overrides Sub OnStart(ByVal args() As String)
    'Instaniate the timer for the service
    _serviceTimer = New Threading.Timer(New Threading.TimerCallback(AddressOf Tick), Nothing, 60000, 60000)
End Sub

Обратный вызов:

Private Sub Tick(ByVal state As Object)

    'Switch off the timer event whilst the code executes
    _serviceTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite)

    If Not _started Then
        Startup()
        _started = True
    End If

    Call ServerProcess()

    'Re-enable the timer now that application code has completed
    _serviceTimer.Change(_longInterval, _longInterval)
End Sub

У меня изначально был процесс запуска в методе OnStart, однако он был удален как попытка решить эту проблему. вопрос, однако это не имеет никакого значения. Метод запуска выглядит следующим образом:

Public Sub Startup()

    Try
        'Source these settings from the local config file
        _appDataFolder = Utilities.GetSetting("AppDataRoot")
        _configPathMapped = _appDataFolder & Utilities.GetSetting("ConfigPathMapped")
        _logPath = _appDataFolder & "\" & utl.GetSetting("LogPath")

        'Instaniate the timer for the service - Commented out after moving startup code from OnStart method
        ' _serviceTimer = New Threading.Timer(New Threading.TimerCallback(AddressOf Tick), Nothing, Timeout.Infinite, Timeout.Infinite)

        'Initialise logging architecture
        _logger = New aslLog.Logger(_configPathMapped & "nlog.config", _logPath, My.Application.Info.ProductName, My.Application.Info.Version.ToString)
        _logger.SendLog("Started PSALERTS Schedule Server Service", NLog.LogLevel.Info, _serviceTimer, _checkInterval, Nothing)

        'Determine if the cloned config files exists in the mapped config file folder
        'We clone these files to a writable destination to allow us to overcome write restrictions ot the C: drive on the SPEN PTI Desktop model
        If Not System.IO.File.Exists(_configPathMapped & "psaservermachine.config") Then
            'Clone the app.config file in the config folder as psaservermachine.config
            Utilities.CloneFile(_programFileLocation & "PSALERTSScheduleServer.exe.config", _configPathMapped & "psaservermachine.config")
        End If

        If Not System.IO.File.Exists(_configPathMapped & "nlog.config") Then
            'Clone the nlog.config file
            Utilities.CloneFile(_programFileLocation & "PSALERTSScheduleServer.exe.config", _configPathMapped & "nlog.config")
        End If

        'Determine the Oracle TNS Environment
        'Check for the existence of the environment variable 'TNS_ADMIN'
        If Environment.GetEnvironmentVariable("TNS_ADMIN") IsNot Nothing Then

            'If TNS_ADMIN exists then we can continue with the application session 

        Else
            Dim oraTnsPath As String = ""
            'If it doesn't exist then we need to determine the Oracle information from the PATH environment variable
            oraTnsPath = GetOraTnsPath()

            If oraTnsPath <> "" Then
                'Then create the TNS_ADMIN environment variable
                Environment.SetEnvironmentVariable("TNS_ADMIN", oraTnsPath)
            Else

                'If no oracle client information exists then raise an error to this effect and exit the app
                'informing the user that they need to install the Oracle client in order to use PSALERTS

                Beep()
                Throw New PSALERTSOracleConfigException(
                                                "PSALERTS Oracle Configuration Error. PSALERTS Did not find a valid Oracle Client." & vbCrLf & vbCrLf &
                                                "Please install a valid Oracle Client and try again." & vbCrLf & vbCrLf &
                                                "If a valid Oracle Client is installed then ensure that the PATH environment variable contains an entry for the Oracle Client." & vbCrLf & vbCrLf &
                                                "For example - TNS_ADMIN=C:\oracle\12.1.0\Client_lite\NETWORK\ADMIN"
                                                )

            End If

        End If

        'Register the application
        If Not Registered() Then
            'Register the application
            Register()

        End If


        If Registered() Then
            'Clean/close any stray Excel processes from previous debug session
            If _debugModeOn Then
                CleanUpRedundantProcesses("EXCEL", "PSALERTS")
            End If

            'instantiate fresh excel session
            _myXLApp = New Excel.Application

            'Get the timer interval settings
            _longInterval = CType(utl.GetSettingServerMachine(_configPath, "appSettings", "LongIntervalMillis"), Integer)
            _initInterval = CType(utl.GetSettingServerMachine(_configPath, "appSettings", "InitialIntervalMillis"), Integer)
            _refreshInterval = CType(utl.GetSettingServerMachine(_configPath, "appSettings", "InitialIntervalMillis"), Integer)

            'Re-start the timer with periodic signalling as per the specified check interval
            _serviceTimer.Change(_initInterval, _initInterval)

        Else
                _started = False
        End If
    Catch ex As Exception
        _logger.SendLog("PSALERTS Schedule Server startup failure.", NLog.LogLevel.Error, ex)
    Finally

    End Try
End Sub

Я использую похожую технику для ряда аналогичных служб, и они работают нормально. Был бы признателен за понимание от любых Windows Сервисных гуру там. О, я использую WiX для установки, опять же, это хорошо изношенный шаблон для ряда подобных приложений.

С уважением, Пол Дж.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Core : Наиболее типичные ошибки:

  • Проблемы с конфигурацией : строки подключения, неправильные пути и т. д. c ...
  • Проблема запуска загрузки (хороший список - из часто задаваемых вопросов)
  • Неверный пароль / учетная запись при работе в режиме реального пользователя с паролем.
  • Отсутствуют файлы или отсутствует время выполнения .
  • Проблемы с разрешениями (ACL / Привилегия NT отсутствует).

Возможно, проверьте этот ответ перед приведенным ниже .


ОБНОВЛЕНИЕ : Может быть, посмотрите на этот предыдущий ответ . Сроки запуска службы. Также проверьте мой ad-ho c ответ там на той же странице.

Отладчик : Кроме этого - ничего похожего на пошаговое выполнение кода с помощью отладчика. Я давно этого не делал. Развернуть отладочные файлы и попробовать? Windows 10 теперь скрывает сообщения от служб - не знаю, как это влияет на отладчики: Больше не нужно переключаться на сеанс 0 .


Я не гуру службы, а специалист по развертыванию , Я просто предоставлю несколько ссылок и посмотрю, поможет ли это. Maybe I have not fully understood the whole problem. I tend to focus on the deployment side and not so much development side.

Список идей / Контрольный список отладки : Это «списки идей», которые могут быть неправильны для приложений в целом, а не только для служб (два первые списки похожи - созданы несколько раз в промежуток):

  1. Cra sh при запуске
  2. Настольное приложение не запускается
  3. Связи общего назначения WiX / MSI

Да, эти списки очень общие c - слишком большие, чтобы их можно было переварить. Мне кажется, просто просмотрите первые два.

Инструменты отладки : Также напоминание о наиболее полезных инструментах отладки служб: Event Viewer, Task Manager, Services.msc, Process Explorer (внутренние устройства), The NET command и SC.exe.

FAQ по хорошему обслуживанию : https://www.coretechnologies.com/WindowsServices/FAQ.html

0 голосов
/ 13 апреля 2020

Ваш метод запуска должен запустить фоновый рабочий и быстро вернуться к SCM, который он запустил. Существует общесистемное значение по умолчанию, равное 30 секундам, но, честно говоря, надлежащая служба должна реагировать через несколько секунд.

Если смотреть ваш код, соединение с базой данных, вероятно, является длинным полюсом, вызывающим проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...