Создать службу Windows из исполняемого файла
Есть ли какой-нибудь быстрый способ, при наличии исполняемого файла, создать службу Windows, которая при запуске запускает ее?
12 ответов
Чтобы создать службу Windows из исполняемого файла, вы можете использовать sc.exe
:
sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
Вы должны иметь кавычки вокруг фактического exe
путь и пробел после binPath=
,
Более подробная информация о sc
Команда может быть найдена в Microsoft KB251192.
Обратите внимание, что он не будет работать только для любого исполняемого файла: исполняемый файл должен быть службой Windows ( т.е. реализовывать ServiceMain). При регистрации исполняемого файла, не являющегося сервисом, в качестве сервиса при попытке запуска сервиса вы получите следующую ошибку:
Ошибка 1053: служба не ответила на запрос запуска или управления своевременно.
Существуют инструменты, которые могут создавать службы Windows из произвольных необслуживаемых исполняемых файлов. Примеры других инструментов см. В других ответах.
Используйте NSSM(диспетчер служб не для сосания), чтобы запустить.BAT или любой файл.EXE в качестве службы.
- Шаг 1: Загрузите NSSM
- Шаг 2: Установите сервис с
nssm.exe install [serviceName]
- Шаг 3: Это откроет графический интерфейс, который вы будете использовать, чтобы найти свой исполняемый файл
Расширяя (Кевин Тонг) ответ.
Шаг 1: Загрузите и распакуйте nssm-2.24.zip
Шаг 2: Из командной строки введите:
C:\> nssm.exe install [servicename]
он откроет графический интерфейс, как показано ниже (например, сервер UT2003), а затем просто перейдите к нему: yourapplication.exe
Более подробная информация на: https://nssm.cc/usage
Эти дополнения оказываются полезными.. должны быть выполнены как администратор
sc install <service_name> binpath=<binary_path>
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
Если в имени вашего сервиса есть пробелы, заключите его в "кавычки".
Многие существующие ответы включают вмешательство человека во время установки. Это может быть подвержен ошибкам процесс. Если у вас есть много исполняемых файлов, которые вы хотите установить как сервисы, последнее, что вам нужно сделать, это сделать их вручную во время установки.
В связи с описанным выше сценарием я создал serman, инструмент командной строки для установки исполняемого файла в качестве службы. Все, что вам нужно написать (и написать только один раз) - это простой файл конфигурации службы вместе с вашим исполняемым файлом. Бежать
serman install <path_to_config_file>
установит сервис. stdout
а также stderr
все вошли. Для получения дополнительной информации взгляните на веб-сайт проекта.
Рабочий файл конфигурации очень прост, как показано ниже. Но он также имеет много полезных функций, таких как <env>
а также <persistent_env>
ниже.
<service>
<id>hello</id>
<name>hello</name>
<description>This service runs the hello application</description>
<executable>node.exe</executable>
<!--
{{dir}} will be expanded to the containing directory of your
config file, which is normally where your executable locates
-->
<arguments>"{{dir}}\hello.js"</arguments>
<logmode>rotate</logmode>
<!-- OPTIONAL FEATURE:
NODE_ENV=production will be an environment variable
available to your application, but not visible outside
of your application
-->
<env name="NODE_ENV" value="production"/>
<!-- OPTIONAL FEATURE:
FOO_SERVICE_PORT=8989 will be persisted as an environment
variable to the system.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
То же, что и ответ Сергея Пожарова, но с помощью командлета PowerShell:
New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice.exe"
Увидеть New-Service
для дополнительной настройки.
Это будет работать только для исполняемых файлов, которые уже реализуют API служб Windows.
Некоторые из самых популярных ответов указывают на NSSM. Проект не обновлялся с 2017 года.
Более современная альтернатива аналогичной функциональности — https://github.com/winsw/winsw/ — содержит множество примеров и хорошую документацию.
Совет для удобного использования, который помог мне настроить его быстрее, чем NSSM: если назватьwinsw
исполняемый какmyapp.exe
и создайте файл конфигурации XMLmyapp.xml
, ты просто бежишьmyapp.exe install
иmyapp.exe start
и вуаля, служба запущена.
Несколько лет назад я создал кроссплатформенное программное обеспечение Service Manager, чтобы я мог запускать PHP и другие языки сценариев в качестве системных служб в ОС Windows, Mac и Linux:
https://github.com/cubiclesoft/service-manager
Service Manager - это набор предварительно скомпилированных двоичных файлов, которые устанавливают и управляют системной службой в целевой ОС с использованием почти идентичных параметров командной строки (также доступен исходный код). У каждой платформы есть небольшие различия, но основные функции в основном нормализованы.
Если дочерний процесс умирает, Service Manager автоматически перезапускает его.
Процессы, запускаемые с помощью Service Manager, должны периодически следить за двумя файлами уведомлений для обработки запросов на перезагрузку и перезагрузку, но они не обязательно должны это делать. Service Manager принудительно перезапустит дочерний процесс, если он не отвечает своевременно на запросы управляемого перезапуска / перезагрузки.
Я протестировал хороший продукт для этого: AlwaysUp. Не бесплатно, но у них есть 30-дневный пробный период, так что вы можете попробовать...
Вы можете проверить мою небольшую бесплатную утилиту для операций создания \ редактирования \ удаления сервиса. Вот пример создания:
Перейдите в Сервис -> Изменить -> Создать
Исполняемый файл (Google Диск): [Загрузить]
Исходный код: [Загрузить]
Сообщение в блоге: [BlogLink]
Класс редактора службы: WinServiceUtils.cs
Вероятно, все ваши ответы лучше, но - чтобы быть полными в выборе вариантов - я хотел напомнить о старом, похожем методе, который использовался годами:
SrvAny (устанавливается InstSrv)
как описано здесь:https://docs.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service
У меня есть другой метод, использующий библиотеку с открытым исходным кодом под названием Topshelf. Я использовал его в проекте ac#, но, возможно, он доступен на разных языках программирования.
Вот видео, которое немного объясняет, как его использовать. https://www.youtube.com/watch?v=y64L-3HKuP0
Суть этой проблемы для многих людей заключается в том, что вы не можете установить какой-либо старый .exe в качестве службы, если вы не используете старый метод, который использовал Томег. Я не смог найти набор инструментов Windows NT, необходимый для его работы.
Я застрял в углу, и это был мой выход.