Crear servicio de Windows desde ejecutable

349

¿Hay alguna forma rápida de, dado un archivo ejecutable, crear un servicio de Windows que, cuando se inicia, lo inicia?

Latorre alemán
fuente
8
Aquí están las instrucciones de Microsoft sobre cómo lograr esto.
PiRX

Respuestas:

460

Para crear un servicio de Windows desde un ejecutable, puede usar sc.exe:

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

Debe tener comillas alrededor de la exeruta real y un espacio después de binPath=.

Se scpuede encontrar más información sobre el comando en Microsoft KB251192 .

Tenga en cuenta que no funcionará para cualquier ejecutable: el ejecutable debe ser un servicio de Windows ( es decir, implementar ServiceMain ). Al registrar un ejecutable que no sea de servicio como servicio, recibirá el siguiente error al intentar iniciar el servicio:

Error 1053: el servicio no respondió a la solicitud de inicio o control de manera oportuna.

Existen herramientas que pueden crear un servicio de Windows a partir de ejecutables arbitrarios que no son de servicio; consulte las otras respuestas para ver ejemplos de dichas herramientas.

Sergii Pozharov
fuente
11
(casi seguro) tendrá que ejecutar el símbolo del sistema como Administrador para que este comando funcione
Jeutnarg
2
La ruta también debe ser la ruta totalmente calificada; no pude hacer que mi servicio se iniciara usando una ruta relativa.
RunOfTheShipe
44
el espacio después de binpath=tener que rodear la ruta ejecutable con comillas dobles es totalmente incorrecto, al menos para Windows 10. la cita se requiere si y solo si la ruta contiene caracteres especiales como espacios en blanco. Además, la carcasa (minúscula / mayúscula / minúscula) no importa en ningún lado, también en los nombres de las variables, y displayname="my service"es otra ventaja para pasar en la línea de comandos al crear un servicio para ver como la primera fila ( Name) en services.msc.
2
El espacio posterior binPath=fue requerido para mí en Windows 7 pero no en Windows 10
datchung
242

Use NSSM ( el Administrador de servicios que no es succionador ) para ejecutar un archivo .BAT o cualquier archivo .EXE como servicio.

http://nssm.cc/

  • Paso 1 : descargue NSSM
  • Paso 2 : Instale su servicio connssm.exe install [serviceName]
  • Paso 3 : Esto abrirá una GUI que usará para ubicar su ejecutable
Kevin Tong
fuente
66
El mejor gerente de servicio. Incluso logré que PlexWatch se instalara como un servicio usando NSSM.
Imperativo el
2
¿Este set es un servicio para siempre? Cada vez que Windows inicia el servicio se iniciará? Además, ¿cómo puedo hacer esto sin la interacción del usuario? un script o código de algún tipo?
John Demetriou
99
Esto es absolutamente genial, desearía poder aceptar esta respuesta en lugar de la primera, :-(
German Latorre
2
Puedo ejecutar Dropbox como un servicio en el servidor. ¡Absolutamente una herramienta que no aspira!
Barry Guvenkaya
1
¿El archivo exe debe ser un proyecto de servicio de Windows, para poder trabajar con nssm o puede ser un archivo exe normal?, Porque cuando uso el inicio nssm [nombre del servidor] muestra un error como, el servicio de Windows no se puede ejecutar desde símbolo del sistema, etc.
Sanjeev
92

Extendiendo la respuesta (Kevin Tong).

Paso 1: descargue y descomprima nssm-2.24.zip

Paso 2: desde el tipo de línea de comando:

C:\> nssm.exe install [servicename]

abrirá la GUI como se muestra a continuación (el ejemplo es el servidor UT2003), luego simplemente búsquelo en: yourapplication.exe

ingrese la descripción de la imagen aquí

Más información sobre: https://nssm.cc/usage


fuente
44
Sintaxis correcta nssm.exe install [serviceName]. Esta solución funciona, pero si tiene una aplicación GUI, no funcionará en Win Serever2003. Si luego desea eliminarlo, usenssm.exe remove [youservicename]
Hammad Khan
1
Supongo que la referencia a nginx se debe a que ese es el programa en particular que desea ejecutar como servicio. Hasta que vi el comentario de hmd anterior, pensé que estabas intentando ayudar al dar a entender que nginx era una dependencia necesaria para instalar o algo así ... pero luego en la GUI parece que no estás instalando nginx, estás instalando un Torneo irreal ¿servidor? Simplemente señalando que el ejemplo es inconsistente y potencialmente engañoso. Un simple "Suponga que desea instalar nginx como un servicio, entonces se vería así:" ayudaría.
flutefreak7
@ flutefreak7 sí nginxno es necesario y engañoso. El comando también funcionará sin él. Es un parámetro opcional si desea proporcionar el nombre del servicio desde el símbolo del sistema.
Hammad Khan
1
Cuando intento usar nssm, mi Windows Forms se está ejecutando pero no se muestra el formulario ... ¿Por qué?
Radenko Zec
Está ejecutando su aplicación como servicio de Windows, la mayoría son para backend. También podría ser que se esté ejecutando como otro nombre de usuario root / admin. Tienes que comprobarlo. También más información que puede consultar aquí: nssm.cc/usage
16

Muchas respuestas existentes incluyen intervención humana en el momento de la instalación. Este puede ser un proceso propenso a errores. Si desea instalar muchos ejecutables como servicios, lo último que desea hacer es hacerlo manualmente en el momento de la instalación.

Hacia el escenario descrito anteriormente, creé serman , una herramienta de línea de comandos para instalar un ejecutable como servicio. Todo lo que necesita escribir (y solo escribir una vez) es un archivo de configuración de servicio simple junto con su ejecutable. correr

serman install <path_to_config_file>

instalará el servicio stdouty stderrestán todos registrados. Para obtener más información, visite el sitio web del proyecto .

Un archivo de configuración de trabajo es muy simple, como se demuestra a continuación. Pero también tiene muchas características útiles como <env>y a <persistent_env>continuación.

<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>
KFL
fuente
9

estos extras resultan útiles ... deben ejecutarse como administrador

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

Si el nombre de su servicio tiene espacios, escríbalo entre comillas.

PodTech.io
fuente
No hay un comando INSTALL ni en mi My Win 2003 sc.exe 5.2.3790.3959, ni en M $ F1
user6698332
1
Use "crear" en lugar de "instalar". sc create <service_name> binpath= <binary_path>
CSquared
4

He probado un buen producto para eso: AlwaysUp . No son gratuitos, pero tienen un período de prueba de 30 días para que pueda probarlo ...

A. Masson
fuente
0

Puede consultar mi pequeña utilidad gratuita para las operaciones de creación / edición / eliminación del servicio. Aquí hay un ejemplo de creación:

Vaya a Servicio -> Modificar -> Crear

ingrese la descripción de la imagen aquí

Archivo ejecutable (google drive): [Descargar]

Código fuente: [Descargar]

Publicación en el blog: [BlogLink]

Clase de editor de servicio: WinServiceUtils.cs

Sergey Vaulin
fuente