Создать службу Windows из исполняемого файла


349

Есть ли какой-нибудь быстрый способ при наличии исполняемого файла создать службу Windows, которая при запуске запускает ее?


8
Вот инструкции Microsoft о том, как этого добиться.
— PiRX

Ответы:


460

Чтобы создать службу Windows из исполняемого файла, вы можете использовать sc.exe:

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

Вы должны иметь кавычки вокруг фактического exeпути и пробел после binPath=.

Более подробную информацию о scкоманде можно найти в Microsoft KB251192 .

Обратите внимание, что он не будет работать только для любого исполняемого файла: исполняемый файл должен быть службой Windows ( т.е. реализовывать ServiceMain ). При регистрации исполняемого файла, не являющегося сервисом, в качестве сервиса, при попытке запуска сервиса вы получите следующую ошибку:

Ошибка 1053: служба не ответила на запрос запуска или управления своевременно.

Существуют инструменты, которые могут создавать службы Windows из произвольных необслуживаемых исполняемых файлов. Примеры других инструментов см. В других ответах.


11
вам (почти наверняка) придется запустить командную строку от имени администратора, чтобы эта команда работала
— Jeutnarg

2
Путь также должен быть полностью определенным путем - я не смог запустить службу, используя относительный путь.
— RunOfTheShipe

4
пробел после binpath=того, как окружать исполняемый путь двойными кавычками, совершенно неправильный, по крайней мере для окон 10. цитирование требуется тогда и только тогда, когда путь содержит специальные символы, такие как пробел. Кроме того, регистр (lowe / upper / mixed-case) нигде не имеет значения, в том числе и в именах переменных, и displayname="my service"является еще одним плюсом для передачи в командной строке при создании службы для просмотра в качестве первой строки ( Name) в services.msc.

2
После binPath=Windows мне потребовалось место на Windows 7, но не на Windows 10
— дата

242

Используйте NSSM ( диспетчер служб не для сосания), чтобы запустить .BAT или любой файл .EXE в качестве службы.

http://nssm.cc/

  • Шаг 1 : Загрузите NSSM
  • Шаг 2 : Установите сервис сnssm.exe install [serviceName]
  • Шаг 3 : Это откроет графический интерфейс, который вы будете использовать, чтобы найти свой исполняемый файл

6
Лучший менеджер по обслуживанию Мне даже удалось заставить PlexWatch установить как службу, используя NSSM.
— императив

2
этот набор - услуга навсегда? каждый раз при запуске windows служба запускается? также как я могу сделать это без взаимодействия с пользователем? скрипт или код какой-то?
— Джон Димитриу

9
Это очень здорово, я бы хотел принять этот ответ вместо первого :-(
— German Latorre

2
Я могу запустить Dropbox как сервис на сервере. Абсолютно не сосущий инструмент!
— Барри Гувенькая

1
Должен ли exe-файл быть проектом службы Windows, чтобы иметь возможность работать с nssm, или это может быть обычный exe-файл? командная строка и т. д.
— Sanjeev

92

Расширяя (Кевин Тонг) ответ.

Шаг 1: Загрузите и распакуйте nssm-2.24.zip

Шаг 2: Из командной строки введите:

C:\> nssm.exe install [servicename]

он откроет графический интерфейс, как показано ниже (например, сервер UT2003), а затем просто перейдите к нему: yourapplication.exe

введите описание изображения здесь

Более подробная информация на: https://nssm.cc/usage


4
Правильный синтаксис nssm.exe install [serviceName]. Это решение работает, но если у вас есть приложение с графическим интерфейсом, оно не будет работать на Win Serever2003. Если позже вы захотите удалить его, используйтеnssm.exe remove [youservicename]
— Хаммад Хан

1
Я предполагаю, что ссылка на nginx связана с тем, что именно эту программу вы хотите запускать в качестве службы? Пока я не увидел комментарий hmd выше, я думал, что вы пытаетесь помочь, подразумевая, что nginx является обязательной зависимостью для установки или чего-то еще ... но в GUI похоже, что вы не устанавливаете nginx, вы устанавливаете Unreal Tournament сервер? Просто указываю на то, что пример противоречив и потенциально вводит в заблуждение. Простое «Предположим, вы хотите установить nginx как сервис, тогда это будет выглядеть так:» поможет.
— flutefreak7

@ flutefreak7 да nginxне нужно и вводит в заблуждение. Команда будет работать и без нее. Это необязательный параметр, если вы хотите указать имя службы из командной строки.
— Хаммад Хан

1
Когда я пытаюсь использовать nssm, запускается Windows Forms, но форма не отображается ... Почему?
— Раденко Зец

Оно запускает ваше приложение как службу Windows, большинство из них для бэкэнда. Возможно также, что он работает под другим именем пользователя root / admin. Вы должны это проверить. Также больше информации вы можете проверить здесь: nssm.cc/usage

16

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

В связи с описанным выше сценарием я создал 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>

9

эти дополнения оказываются полезными .. должны быть выполнены как администратор

sc create  <service_name> binpath=<binary_path>
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

Если в названии вашего сервиса есть пробелы, заключите его в "кавычки".


Нет ни команды INSTALL ни в моем My Win 2003 sc.exe 5.2.3790.3959, ни в M $ F1
— user6698332

1
Используйте «создать» вместо «установить». sc create <service_name> binpath= <binary_path>
— CSquared

4

Я протестировал хороший продукт для этого: AlwaysUp . Не бесплатно, но у них есть 30-дневный пробный период, так что вы можете попробовать ...


0

Вы можете проверить мою маленькую бесплатную утилиту для операций create \ edit \ delete. Вот пример создания:

Зайдите в Сервис -> Изменить -> Создать

введите описание изображения здесь

Исполняемый файл (Google Drive): [Скачать]

Исходный код: [Скачать]

Сообщение блога: [BlogLink]

Класс редактора сервиса: WinServiceUtils.cs

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.