Служба Windows, использующая nssm, работает, но не работает с Windows SC

Я должен был преобразовать скомпилированный GoLang файл .exe в качестве службы в Windows, но поскольку служба выполнялась с 9 параметрами извне, поэтому я решил использовать SC для создания .exe в качестве службы, и мой синтаксис был таким:

sc create myservice binPath= "\"PATH\file.exe\" -param1=value -param2=value -param3=value...-param9=value" displayname= "MyServer"  start= auto

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

Но когда я создал ту же службу с синтаксисом nssm,

nssm install myservice "PATH\file.exe" -param1=value -param2=value -param3=value...-param9=value

Это работало, и я получал ответ от своей службы, я не знаю, связана ли проблема с синтаксисом в SC или с моей службой...

Я даже пробовал много возможных способов, таких как удаление \" и прямое указание параметров, таких как binPath= "PATH/file.exe -param1=value -param2=value...param9=value", но это не сработало, и я также пытался передать параметры внутри кавычек, это тоже не сработало :( Буду признателен за любую помощь.


person Kamikaze    schedule 28.06.2016    source источник
comment
Нам нужно увидеть код.   -  person Harry Johnston    schedule 29.06.2016
comment
ну @HarryJohnston Я не могу опубликовать код по некоторым причинам, но я могу сказать, что процесс происходит в коде. Он получает данные об использовании ЦП машины и отправляет их приложению с помощью HTTP POST. Приложению нужны уникальные данные, которые мне нужно предоставить для каждой машины, на которой я запускаю, поэтому я дал их (уникальные данные) в качестве внешних параметров (9 параметров), которые отправляются вместе с использованием ЦП в POST. Каждые 10 минут его POST' ed и статус ответа регистрируется в файле журнала ...   -  person Kamikaze    schedule 29.06.2016
comment
Проблема вряд ли связана с тем, для чего предназначена служба, так что на самом деле это не помогает. Ошибка 1053 возникает, когда исполняемый файл не может вызвать StartServiceCtrlDispatcher или делает это недостаточно быстро. Судя по всему, вы делаете это в Go, вызывая функцию Run из пакета golang.org/x/sys/windows/svc. Возможно, ваша основная функция завершается без вызова Run, потому что ей не нравятся переданные ей параметры?   -  person Harry Johnston    schedule 30.06.2016
comment
@HarryJohnston Спасибо за подсказку, братан, но я думаю, что с пакетом svc нечего делать, так как он обрабатывает только тот, который уже является службой. Что я пытаюсь сделать здесь, чтобы просто преобразовать exe в службу вручную, а не из GO .. И да, похоже, sc не нравятся заданные ему параметры..   -  person Kamikaze    schedule 30.06.2016
comment
Вы сказали, что sc работает для других ваших исполняемых файлов, поэтому эти исполняемые файлы должны использовать пакет svc или его аналог. Вы не можете использовать sc непосредственно в исполняемом файле, который не был создан как служба. Это никогда не сработает. (Конечно, вы можете использовать sc косвенно, указав его на srvany.exe или nssm.exe или эквивалентное.)   -  person Harry Johnston    schedule 01.07.2016
comment
Скопируйте и вставьте выходные данные sc qc myservice как для неработающей службы, так и для одной из работающих служб. (Вам также может быть полезно сравнить выходные данные sc qc при установке службы с помощью sc и при установке с помощью nssm.)   -  person Harry Johnston    schedule 01.07.2016
comment
@HarryJohnston спасибо за команду ... тем не менее nssm показывает binpath только как C:\test\nssm.exe, но не с параметрами .. где мой binpath - это тот, который я дал с параметрами (C:\test\myapp .exe -param1=xx -param2=xxx ..)и так..   -  person Kamikaze    schedule 27.07.2016
comment
И до сих пор я не нашел правильного решения этой проблемы ... Грустная жизнь :'(   -  person Kamikaze    schedule 27.07.2016


Ответы (1)


Хотя SC с радостью установит любой исполняемый файл в качестве службы Windows, ее следует использовать только для установки исполняемых файлов, которые уже являются службами Windows. Если вы используете SC для установки обычного исполняемого файла, ваша служба завершится с ошибкой Error 1053. когда пытаешься завести. Ваш Go exe, который не реализует интерфейс службы Windows, становится жертвой этой ситуации.

person CoreTech    schedule 28.06.2016
comment
Но я сделал это с другими .exe, которые скомпилированы с использованием GO, и они отлично работали с SC. Службы Windows, можете ли вы объяснить это? - person Kamikaze; 28.06.2016
comment
Обратите внимание, что nssm нельзя использовать для установки реальных служб, он используется для запуска произвольных приложений, как если бы они были службами. Если и nssm, и sc работают, ваш исполняемый файл слишком умный и работает либо как служба, либо как приложение, в зависимости от того, как вы его запускаете. - person Harry Johnston; 29.06.2016
comment
Спасибо за информацию, но я серьезно не могу понять разницу между сервисом и exe ... из Интернета я, возможно, понял, что сервис - это exe под наблюдением диспетчера служб, а обычный exe находится под наблюдением диспетчера Windows ... Я м все еще не ясно, как они оба выполняют ... Нужно узнать больше .. - person Kamikaze; 29.06.2016
comment
Вы уверены, что другие ваши приложения Go правильно работают как службы Windows? При запуске не выдает ошибку #1053? - person CoreTech; 29.06.2016
comment
@Kamikaze: нормальное приложение не должно вызывать функции диспетчера окон, если оно действительно не хочет отображать окно, но служебное приложение должно вызывать функции управления службой (такие как StartServiceCtrlDispatcher), чтобы запустить правильно. Если это не так, диспетчер управления службами решает, что он завис, и завершает его. - person Harry Johnston; 30.06.2016
comment
@CoreTech Да, он работает правильно, и я запускаю другое приложение с этим .. - person Kamikaze; 30.06.2016