Сервис не работает, если не запущен вручную - PullRequest
0 голосов
/ 07 ноября 2011

Итак, я создал эту службу Windows в VB.Net, и все, что она делает, это выполняет несколько вызовов и сидит там.(На самом деле ничего не делает)

Я установил его на тестовом компьютере, и когда я запускаю его вручную, он запускается.Когда я останавливаюсь вручную, выключается должным образом (вызывается onStop).

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

Я установил службу с правами администратора, так что это не должно быть проблемой.

Вот что у меня есть:

Sub New()

    ' This call is required by the Windows Form Designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

    '' Open our log file
    FileReader = New IO.StreamWriter("C:\test.txt", True)



    Log("Starting service...")

    '' Get the username from the process list (If explorer is open (Meaning a user is logged in)
    Dim ProcessList As System.Diagnostics.Process()
    ProcessList = System.Diagnostics.Process.GetProcesses()
    Dim Proc As System.Diagnostics.Process
    For Each Proc In ProcessList
        If Proc.ProcessName.ToLower() = "explorer" Then
            My.Settings.Username = GetProcessUserName(Proc)
            Exit For
        End If
    Next

    Log("Fetched user name: " & My.Settings.Username)
    Try
        '' Get the IP address of the machine
        Dim h As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
        My.Settings.IP = h.AddressList.GetValue(0).ToString

        '' Get the Machine Information
        My.Settings.MachineName = System.Environment.MachineName()

        '' Get the Operating System Version
        Dim osInfo As New FindOsInfo
        My.Settings.OS = osInfo.OsName.ToString().Replace(" ", "").Split("|")(0)

    Catch ex As Exception
        Log("Startup error: " & ex.Message)
    End Try


    '' Start server listen here


End Sub

'Protected Overrides Sub OnStart(ByVal args() As String)

'End Sub

Protected Overrides Sub OnStop()
    ' Add code here to perform any tear-down necessary to stop your service.
    Log("Closing down service...")
    FileReader.Close()

End Sub

    Public Sub Log(ByVal str As String)
        Dim time As DateTime = DateTime.Now
        FileReader.WriteLine("[" & time.ToString("G") & "] " & str)
        FileReader.Flush()
    End Sub

Спасибо за ваше время!

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Исключение, вероятно, выдается при автоматическом запуске, в результате чего процесс прерывается (и служба останавливается).

Вам необходимо добавить ведение журнала в службу, чтобы определить причину исключения - разрешениепричина, и вы готовы идти.

1 голос
/ 07 ноября 2011

Скорее всего, проблема заключается в том, что My.Settings.UserName - ничто, когда вы перезагружаете машину, поскольку нет интерактивного пользователя, поэтому ваше утверждение:

 Log("Fetched user name: " & My.Settings.Username)

вызывает исключение.Вы должны переместить весь свой код после:

Log("Starting service...")

внутри Try, а также добавить тест на существование имени пользователя перед его регистрацией:

If My.Settings IsNot Nothing AndAlso My.Settings.UserName IsNot Nothing Then
     Log("Fetched user name: " & My.Settings.Username)
Else
     Log("No interactive user")
End if
0 голосов
/ 07 ноября 2011

Если ваш сервис выполняет большую часть работы в рамках своей обработки OnStart, возможно, что часть этой работы выполняется по таймауту, потому что она выполняется в загруженное время, когда запускается множество других процессов.Если это так, попробуйте переделать службу, чтобы она выполняла абсолютный минимум во время OnStart.Запустите таймер для запуска после задержки или новый поток для выполнения потенциально длинного кода запуска через некоторое время.Это также улучшит вероятность того, что необходимые вам сервисы, которые не указаны явно в зависимости от конфигурации сервиса, будут доступны.

Кроме того, это хороший код окружения с try / catch и протоколирование неожиданных исключений минимальным образомнаименьшие зависимости (например, журнал событий).

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