Превратите вашу программу в надлежащий сервис Windows ™ или «оберните» ее каким-нибудь вспомогательным инструментом, чтобы сделать его сервисом Windows ™.
Первый вариант чище, поскольку он позволяет вашей программе быть в курсе запросов управления, которые подсистема управления службами Windows будет отправлять вам.Вы также можете легко превратить свою программу в упакованный продукт, если / когда это необходимо.Вы можете начать с golang.org/x/sys/windows/svc
.
Последнее может быть немного проще, но YMMV.Если вы хотите изучить этот способ, ищите такие инструменты, как srvany
, nssm
, winsv
и т. Д.
Обратите внимание, что из них только srvany
предоставлены Microsoft® и AFAIK, он отсутствует со времен Win7, W2k8, поэтому ваша лучшая встроенная ставка может быть связана с sc.exe
.
В любом случае, если вы выберете этот маршрут, вам придется разобраться с вопросом настройки надлежащих разрешений на ресурсы вашего приложения.Этот вопрос сам по себе достаточно сложный, поскольку в нем задействовано много движущихся частей.
Для начала вам нужно убедиться, что к вашим ресурсам пытаются получить доступ не из «текущего каталога процесса», который может бытьв основном случайный, когда он запускается как служба, но либо из того места, о котором процесс был явно указан при запуске (с помощью параметра командной строки или чего-либо еще), либо как-то выяснил, используя обоснованное предположение (и это сложная тема сама по себе).
Затем вы должны либо убедиться, что учетная запись, которую использует Windows ™ для запуска вашей службы, действительно имеет разрешения для доступа к месту хранения ваших активов. Другой возможностью является добавление выделенной учетной записи и созданиеSCM использует его для запуска вашей службы.
Обратите внимание, что в любом случае правильная обработка ошибок и их отчетность имеет первостепенное значение: когда ваша программа запускается неинтерактивно, вы хотите знать, когда что-тоидет не так: сокет не удалось открыть или списокВключено, активы не найдены, доступ запрещен при попытке открыть файл ресурса и т. д. - во всех этих случаях вам необходимо: 1) обработать ошибку и 2) сообщить о ней так, как вы можете ее устранить.Для неинтерактивной программы Windows ™ лучшим способом может быть использование журнала событий (скажем, через golang.org/x/sys/windows/svc/eventlog
).