¿Hay alguna forma rápida de, dado un archivo ejecutable, crear un servicio de Windows que, cuando se inicia, lo inicia?
¿Hay alguna forma rápida de, dado un archivo ejecutable, crear un servicio de Windows que, cuando se inicia, lo inicia?
Respuestas:
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 exe
ruta real y un espacio después de binPath=
.
Se sc
puede 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.
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
.
binPath=
fue requerido para mí en Windows 7 pero no en Windows 10
Use NSSM ( el Administrador de servicios que no es succionador ) para ejecutar un archivo .BAT o cualquier archivo .EXE como servicio.
nssm.exe install [serviceName]
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
Más información sobre: https://nssm.cc/usage
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]
nginx
no 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.
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 stdout
y stderr
está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>
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.
sc create <service_name> binpath= <binary_path>
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
Archivo ejecutable (google drive): [Descargar]
Código fuente: [Descargar]
Publicación en el blog: [BlogLink]
Clase de editor de servicio: WinServiceUtils.cs