Pregunta

¿Cómo puedo programar un bat o cmd para detener e iniciar un servicio de manera confiable con verificación de errores (o informarme que no tuvo éxito por cualquier motivo)?

¿Fue útil?

Solución

Use el comando SC (control de servicio), le ofrece muchas más opciones que solo start & amp; stop.

  DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc <server> [command] [service name]  ...

      The option <server> has the form "\\ServerName"
      Further help on commands can be obtained by typing: "sc [command]"
      Commands:
        query-----------Queries the status for a service, or
                        enumerates the status for types of services.
        queryex---------Queries the extended status for a service, or
                        enumerates the status for types of services.
        start-----------Starts a service.
        pause-----------Sends a PAUSE control request to a service.
        interrogate-----Sends an INTERROGATE control request to a service.
        continue--------Sends a CONTINUE control request to a service.
        stop------------Sends a STOP request to a service.
        config----------Changes the configuration of a service (persistant).
        description-----Changes the description of a service.
        failure---------Changes the actions taken by a service upon failure.
        qc--------------Queries the configuration information for a service.
        qdescription----Queries the description for a service.
        qfailure--------Queries the actions taken by a service upon failure.
        delete----------Deletes a service (from the registry).
        create----------Creates a service. (adds it to the registry).
        control---------Sends a control to a service.
        sdshow----------Displays a service's security descriptor.
        sdset-----------Sets a service's security descriptor.
        GetDisplayName--Gets the DisplayName for a service.
        GetKeyName------Gets the ServiceKeyName for a service.
        EnumDepend------Enumerates Service Dependencies.

      The following commands don't require a service name:
      sc <server> <command> <option>
        boot------------(ok | bad) Indicates whether the last boot should
                        be saved as the last-known-good boot configuration
        Lock------------Locks the Service Database
        QueryLock-------Queries the LockStatus for the SCManager Database
  EXAMPLE:
          sc start MyService

Otros consejos

net start [serviceName]

y

net stop [serviceName]

le dice si han tenido éxito o han fallado con bastante claridad. Por ejemplo

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

Si se ejecuta desde un archivo por lotes, tiene acceso al ERRORLEVEL del código de retorno. 0 indica éxito. Cualquier cosa más alta indica falla.

Como un archivo bat, error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

El resultado se ve así:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Códigos de retorno

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

Editar 20.04.2015

Códigos de retorno:

  

El comando NET no devuelve los códigos de retorno documentados de la clase Win32_Service (Servicio no activo, Tiempo de espera de solicitud de servicio, etc.) y para muchos errores simplemente devolverá Errorlevel 2.

Mire aquí: http://ss64.com/nt/net_service.html

Puede usar el comando NET START y luego verificar la variable de entorno ERRORLEVEL, por ejemplo

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Descargo de responsabilidad: he escrito esto desde la parte superior de mi cabeza, pero creo que funcionará.

En lugar de verificar códigos, esto también funciona

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

He creado mi archivo por lotes personal para esto, el mío es un poco diferente, pero puede modificarlo como mejor le parezca. Creé esto hace un tiempo porque estaba aburrido y quería hacer una manera simple para que las personas puedan ingresar el final, el inicio, la detención o la configuración en automático. Este archivo BAT simplemente le solicita que ingrese el nombre del servicio y hará el resto por usted. No me di cuenta de que estaba buscando algo que indicara algún error, debo haber leído mal esa parte. Aunque normalmente esto se puede hacer ingresando & Gt; & Gt; output.txt al final de la línea.

El% var% es solo una forma para que el usuario pueda ingresar su propio servicio en este, en lugar de tener que modificar el archivo bat cada vez que desea iniciar / detener un servicio diferente.

Si estoy equivocado, cualquiera puede sentirse libre de corregirme al respecto.

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

Usando los códigos de retorno de net start y net stop Me parece el mejor método.Prueba a ver esto: Códigos de retorno de Net Start.

La sintaxis siempre me atrapa ... así que ...

Aquí está explícitamente cómo agregar una línea a un archivo por lotes que matará un servicio remoto (en otra máquina) si usted es un administrador en ambas máquinas, ejecute .bat como administrador y las máquinas están en el mismo dominio. El nombre de la máquina sigue el formato UNC \ myserver

sc \\ip.ip.ip.ip stop p4_1

En este caso ... p4_1 era tanto el Nombre del servicio como el Nombre para mostrar, cuando ve las Propiedades del servicio en el Administrador de servicios. Debe usar el nombre del servicio.

Para sus adictos a Service Ops ... ¡asegúrese de agregar su código de razón y comentar! es decir, '4' que equivale a 'Planificado' y comentar 'Detener el servidor por mantenimiento'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

Nos gustaría pensar que " net stop " Parará el servicio. Lamentablemente, la realidad no es tan en blanco y negro. Si el servicio tarda mucho en detenerse, el comando volverá antes de que se detenga. Sin embargo, no lo sabrá, a menos que marque el nivel de error.

La solución parece ser un ciclo en busca del estado del servicio hasta que se detenga, con una pausa cada vez que se completa el ciclo.

Pero, de nuevo ...

Veo que el primer servicio tarda mucho en detenerse, luego & "; net stop &"; para un servicio posterior simplemente parece no hacer nada. Mire el servicio en el administrador de servicios, y su estado sigue siendo & Quot; Iniciado & Quot; - sin cambios en " Deteniendo " ;. Sin embargo, puedo detener este segundo servicio manualmente usando el SCM, y se detiene en 3 o 4 segundos.

o puede iniciar el servicio remoto con este cmd: sc \\<computer> start <service>

Utilicé el ejemplo anterior de Jonas y creé una lista completa de 0 a 24 niveles de error.Otra publicación es correcta que net start y net stop uso único errorlevel 0 para éxito y 2 para fracaso.

Pero esto es lo que funcionó para mí:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

Cambiar stop a start y funciona a la inversa.

El reinicio manual del servicio está bien: services.msc tiene " Reiniciar " botón, pero en la línea de comandos los comandos sc y net carecen de " reiniciar " cambie y si el reinicio está programado en el archivo cmd / bat, el servicio se detiene y se inicia de inmediato, a veces se produce un error porque el servicio aún no se detiene, necesita algo de tiempo para apagar las cosas.

Esto puede generar un error: sc stop sc start

Es una buena idea insertar tiempo de espera, utilizo ping (suena cada 1 segundo): sc stop ping localhost -n 60 sc start

SC puede hacer todo con los servicios ... iniciar, detener, verificar, configurar y más ...

A veces puedes encontrar que la parada no funciona ...

Mi SQlServer a veces hace esto. Usar la siguiente línea de comando lo mata. Si realmente necesitas tu script para matar cosas que no se detienen. Me gustaría que hiciera esto como último recurso

taskkill /pid [pid number] /f

Aquí está el comando de Windows 10 para iniciar Restaurar sistema usando lote:

sc config swprv start= Auto

También te pueden gustar esos comandos:

  • Cambiar el valor del registro para iniciar automáticamente la Restauración del sistema

    REG ADD " HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore " / v DisableSR / t REG_DWORD / d 0 / f

  • Crear un punto de restauración del sistema

    Wmic.exe / Namespace: \ root \ default Path SystemRestore Llame a CreateRestorePoint " djibe guardó su PC " ;, 100, 12

  • Cambiar el uso del disco de Restaurar sistema

    vssadmin cambiar el tamaño de shadowstorage / for = C: / on = C: / maxsize = 10%

Disfruta

Estoy escribiendo un servicio de Windows en C#, el bucle detener/desinstalar/compilar/instalar/iniciar se volvió demasiado agotador.Escribí un mini guión, lo llamé reploy.bat y lo coloco en mi directorio de salida de Visual Studio (uno que tiene el ejecutable del servicio integrado) para automatizar el bucle.

Simplemente configura estas 3 variables

servicename :esto aparece en el panel de control de servicios de Windows (services.msc)

slndir :carpeta (no la ruta completa) que contiene el archivo de su solución (.sln)

binpath :ruta completa (no la ruta de la carpeta) al servicio ejecutable desde la compilación

NOTA:Esto debe ejecutarse desde la línea de comandos del desarrollador de Visual Studio para el msbuild comando para trabajar.

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

Quizás esto ayude a alguien :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top