Создать службу 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 в качестве службы.

http://nssm.cc/

  • Шаг 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, необходимый для его работы.

Я застрял в углу, и это был мой выход.

Другие вопросы по тегам