Ejecute el archivo por lotes como un servicio de Windows

159

Para ejecutar una aplicación, se debe iniciar un archivo por lotes (que hace cosas como iniciar Jetty, mostrar registros en vivo, etc.). La aplicación solo funcionará si este archivo por lotes se está ejecutando. Por lo tanto, me veo obligado a ejecutar este archivo por lotes y no cerrar sesión en el servidor de Windows.

¿Se puede ejecutar este archivo por lotes como un servicio? Estoy experimentando con una de las sugerencias de una pregunta similar .

publicRavi
fuente
27
La programación por lotes es sobre el tema de Stack Exchange.
Harry Johnston
12
Buena pregunta. +1. Los moderadores están demasiado enojados ... También tengo otra buena respuesta, pero la pregunta está cerrada ((
gavenkoa
Yo uso este RunAsService en su lugar: runasservice.com . Es mucho, mucho más simple de usar. Sin configuración de XML sin sentido. Básicamente, esto solo le da el ejecutable RunAsService.exe, que envuelve cualquier aplicación de consola con argumentos de línea de comandos como un servicio. ¡Lo uso para ejecutar scripts de Cygwin bash como servicios! Desafortunadamente, esta herramienta simple parece ser de código cerrado.
Kaz
8
nominando para volver a abrir sobre la base de "herramientas de software comúnmente utilizadas por los programadores". Cuál es la respuesta a esta pregunta definitivamente es. También tenga en cuenta que este es el primer resultado de Google al buscar "el archivo por lotes de inicio de Windows como un servicio", por lo que si está dentro del alcance limitado que algunos moderadores están 'en el tema', el resto del mundo cree que lo está. Voto por el pragmatismo sobre el dogmatismo aquí.
Adam Cameron
Una pregunta similar se puede encontrar en serverfault serverfault.com/questions/54676/…
Stephen Quan

Respuestas:

151

NSSM es totalmente gratuito e hiperfácil, ejecuta el símbolo del sistema / terminal como administrador:

nssm install "YourCoolServiceNameLabel"

entonces aparecerá un cuadro de diálogo para que pueda elegir dónde está el archivo que desea ejecutar.

para desinstalar

nssm remove "YourCoolServiceNameLabel"
Junior Mayhé
fuente
25
+1 Nunca he oído hablar de este pero es muy agradable. NSSM no apesta de hecho!
Byron Whitlock
1
me llevó 2 minutos instalar un servicio
Ben Wilde
3
@ Junior M ¡Gracias! Me salvaste. He pasado 4 horas para esto. ¡¡Gracias!!
verystrongjoe
2
¿sabe si hay una manera de dar nssmtodos los argumentos necesarios en la entrada para evitar la entrada de datos emergentes? ¿Estoy tratando de automatizar el proceso?
anfibio
1
NSSM sigue siendo eliminado en algunos de nuestros clientes por el antivirus GDATA. Sí, lo sé, lista blanca ... pero los clientes no hacen lo que es bueno para ellos. Esa es la triste verdad.
Dreamspace Presidente
61

¿Por qué no simplemente configurarlo como una Tarea Programada que está programada para ejecutarse al inicio?

Stephen Martin
fuente
1
Tengo una serie de archivos por lotes que realizan copias de seguridad mediante robocopy que comienzo a través de las Tareas programadas (vaya al Panel de control, Tareas programadas) que se ejecutan en un servidor Win 2003. Works a treat ...
SAL
Acabo de hacer esto con un script que usamos para monitorear nuestro servicio de respaldo. Funciona a las mil maravillas.
music2myear
1
Esta es la mejor solución de la OMI. no requiere software de terceros ni interfaz de línea de comandos. Además, el programador de tareas ofrece un montón de opciones para los desencadenantes, condiciones, etc.
dev
3
Funciona ahora que descubrí esto: cuando la tarea se ejecuta al inicio (con "Ejecutar si el usuario ha iniciado sesión o no")% UserProfile% es C: \ Users \ Default \ En cualquier otro momento será el C: \ Users \ esperado ExpectedUser \ Esto puede crear fallas misteriosas para algunos archivos .bat que parecen funcionar bien en otras tareas programadas.
user1754036
2
Las tareas programadas son notoriamente poco confiables: en realidad me he encontrado con esta pregunta debido a todos los problemas que he tenido con las tareas que no se inician a tiempo sin razón aparente.
22

Hay un cmd de Windows incorporado para hacer esto: sc create . No es tan sofisticado como nssm, pero no tiene que descargar una pieza adicional de software.

sc create "ServiceName" start= demand displayname= "DisplayName" binpath= [path to .bat file]

Nota

  • inicio = demanda significa que debe iniciar el servicio usted mismo
  • se requiere espacio en blanco después =
  • Me encontré con un error al iniciar el servicio que el servicio no respondió de manera oportuna, pero estaba claro que el servicio había ejecutado el .bat con éxito. Todavía no he profundizado en esto, pero este hilo experimentó lo mismo y lo resolvió usando nssm para instalar el servicio.
w00ngy
fuente
44
Windows parece no ejecutar archivos .bat como servicios.
Perkins
@Perkins - La mía estaba trabajando ayer en un par de máquinas. ¿Estás experimentando algo específico? Encontré un error que el servicio no respondió de manera oportuna al inicio, pero el archivo .bat fue para iniciar el servidor Kibana node.js y se estaba ejecutando con éxito incluso con el error. Los chicos de este hilo parecían experimentar lo mismo pero no con nssm. stackoverflow.com/a/40130630/885535
w00ngy
2
En mi caso, los archivos que se supone que crea el archivo por lotes no se crean y los programas no se están ejecutando, por lo que debo suponer que no lo está iniciando. Me las arreglé para solucionarlo creando el servicio para ejecutar cmd.exe / C <batchfile> en su lugar. Tenga en cuenta que estoy usando Windows 10, por lo que esto puede ser algo nuevo de "seguridad".
Perkins
@Perkins Lo acabo de ejecutar en win10 1803 sin problema, inicia mi servidor node.js. ¿El archivo bat crea los archivos y ejecuta los servicios cuando se llama desde cmd o powershell? ¿Recibes cuadros de mensajes cuando vas a iniciar el servicio? ¿Su servicio tiene permiso para esos directorios? Puede agregar algunos errores de registro en el bate escribiendo en un archivo de registro local, vea si eso está funcionando.
w00ngy
1
Obtenga " Error 1053: El servicio no respondió a la solicitud de inicio o control de manera oportuna " .
Alex Klaus,
5

No hay necesidad de software adicional. Use el programador de tareas -> crear tarea -> oculto. La casilla de verificación para oculto está en la esquina inferior izquierda. Configure la tarea para que se active al iniciar sesión (o cualquier condición que desee) y elija la tarea en la pestaña de acciones. Ejecutarlo oculto asegura que la tarea se ejecute silenciosamente en segundo plano como un servicio.

Tenga en cuenta que también debe configurar el programa para que se ejecute "si el usuario ha iniciado sesión o no" o el programa seguirá ejecutándose en primer plano.

Zediiiii
fuente
3

Como dice Doug Currie, use RunAsService.

De mi experiencia pasada debes recordar que el Servicio que generes

  • tener un conjunto completamente diferente de variables de entorno
  • tiene que ser inspeccionado cuidadosamente por problemas de derechos / permisos
  • podría causar estragos si abre cuadros de diálogo que solicitan cualquier tipo de entrada

No estoy seguro si el último todavía se aplica ... fue una gran yegua nocturna en un proyecto en el que trabajé hace algún tiempo.

Lexu
fuente
3

Si bien no es gratis (pero $ 39), FireDaemon ha funcionado tan bien para mí que tengo que recomendarlo. Ejecutará su archivo por lotes, pero tiene un montón de funcionalidades adicionales y muy útiles, como la programación, la supervisión del servicio, la instalación de servicios basados ​​en GUI o XML, dependencias, variables ambientales y gestión de registros.

Comencé a usar FireDaemon para iniciar servidores de aplicaciones JBoss ( run.bat ) pero poco después me di cuenta de que la riqueza de las capacidades de configuración de FireDaemon me permitió deshacerme del archivo por lotes y recrear la intención de sus comandos en la definición del servicio FireDaemon.

También hay un SUPER FireDaemon llamado Trinity que es posible que desee ver si tiene una gran cantidad de servidores Windows en los que administrar este servicio (o técnicamente, cualquier servicio).

Nicholas
fuente
2

En Windows 2019 Server, puede ejecutar un servidor Minecraft java con estos comandos:

sc create minecraft-server DisplayName = "minecraft-server" binpath = "cmd.exe /CC:\Users\Administrator\Desktop\rungui1151.lnk" type = own start = auto

El archivo .lnk es un acceso directo estándar de Windows a un archivo por lotes.

--- comienza el archivo .bat ---

java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar

--- finaliza el archivo .bat ---

Todo esto porque:

el servicio no sabe cómo comenzar en una carpeta,

cmd.exe no sabe cómo iniciar en una carpeta

Iniciar el servicio producirá un error de "manera oportuna", pero el archivo de registro revela que el servidor se está ejecutando.

Si necesita cerrar el servidor, simplemente vaya al administrador de tareas y encuentre el servidor java en procesos en segundo plano y finalícelo, o finalice el servidor desde el juego usando el comando / stop, o para otros programas / servidores, use los métodos relevante para el servidor.

Goofyseeker311
fuente
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran una aclaración del autor de la pregunta . - De la opinión
Jeremy J Starcher
1
si lo lee correctamente, notará que contiene la respuesta perfecta, relevante para un ejemplo
Goofyseeker311
0

AlwaysUp ejecutará fácilmente su archivo por lotes como un servicio. Es similar a FireDaemon (mencionado anteriormente) y no es gratuito, pero es posible que el conjunto de funciones enriquecidas sea un activo en un entorno profesional.

¡Buena suerte!

CoreTech
fuente