2008-09-25 16 views
246

¿Cómo puedo guiar un murciélago o un cmd para detener e iniciar un servicio confiablemente con la comprobación de errores (o déjenme saber que no fue exitoso por alguna razón)?¿Detener e iniciar un servicio mediante un archivo por lotes o cmd?

+0

Tal vez algo fuera de lugar (ya que pides instrucciones bat y cmd) pero: ** PowerShell ** te da mucho control y comentarios para hacer acciones como esta. – GvS

Respuesta

309

Utilice el comando SC (control de servicio), que le da mucho más opciones que simplemente start & 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 
+7

¡ese vertedero de pantalla acaba de ganar el premio! gracias, ¡ni siquiera sabía sobre 'sc'! – Keng

+1

Acepto que esto es mejor que el inicio/detención de la red. Tenga en cuenta que también hay una opción para tocar servicios en máquinas remotas. –

+1

Gran respuesta. Pero debe ser administrador para ejecutar 'SC start service'. Encontré una solución para eso [aquí] (http://superuser.com/questions/419194/is-there-a-way-to-allow-standard-users-to-restart-stop-start-the-print- cola de impresión). (La respuesta aceptada contiene la solución) –

6

El uso de los códigos de retorno de net start y net stop parece ser el mejor método para mí. Eche un vistazo a esto: Net Start return codes.

+1

La página vinculada ya no existe. Como tal, esto es más un comentario ahora. – Neolisk

172
net start [serviceName] 

y

net stop [serviceName] 

te dice si se han logrado o no 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, se tiene acceso a la ERRORLEVEL del código de retorno. 0 indica éxito. Cualquier cosa más alta indica falla.

Como bat, error.bat:

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

La salida tiene el siguiente aspecto:

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 

Edición 04/20/2015

Códigos de retorno:

The NET command does not return the documented Win32_Service class return codes (Service Not Active,Service Request Timeout, etc) and for many errors will simply return Errorlevel 2.

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

+8

¡Esta es la respuesta que deberíamos ver más! Buen trabajo. – Pokus

+2

No todos son míos: los códigos de devolución provienen de una edición de comunidad ... –

+2

Bueno, es una buena respuesta. Gracias un montón. –

26

Puede utilizar el comando NET START y compruebe 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 lo más alto de mi cabeza, pero creo que funcionará.

+0

Funciona para mí, gracias @Jonas – MikeRoger

1

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

3

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

7

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

net start "Apache tomcat" || goto ExitError 

:End 
exit 0 

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

sintaxis me consigue siempre .... así ...

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

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

En este caso ... p4_1 era a la vez el nombre de servicio y el nombre de visualización, al ver las propiedades para el servicio del 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 comentarios! es decir, '4' que es igual a 'planificada' y comentar 'Detener servidor para el mantenimiento'

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

¿Cómo hago esto si necesito usar otra identificación de usuario y contraseña para iniciar sesión? – Frantumn

+1

Ejecuta 'CMD' como el otro usuario/ID haciendo' runas/user: Domain \ UserName cmd' y luego ingresa su contraseña. CMD comenzará a ejecutarse como la cuenta de usuario especificada. – user4317867

4

Nos gustaría pensar que "net stop" detendrá el servicio. Lamentablemente, la realidad no es tan blanco y negro. Si el servicio tarda mucho tiempo en detenerse, el comando volverá antes de que el servicio se haya detenido. No lo sabrás, a menos que compruebes errorlevel.

La solución parece ser recorrer todo el estado del servicio hasta que se detenga, con una pausa cada vez que se pasa el ciclo.

Pero, de nuevo ...

que estoy viendo el primer servicio tardan mucho tiempo para parar, entonces el "net stop" para un servicio posterior simplemente parece no hacer nada. Mire el servicio en el administrador de servicios, y su estado todavía está "Iniciado", sin cambios en "Detener". Sin embargo, puedo detener este segundo servicio manualmente usando el SCM, y se detiene en 3 o 4 segundos.

5

He creado mi archivo de lote personal para esto, el mío es un poco diferente, pero siéntase libre de modificarlo como mejor le parezca. Creé esto hace un momento porque estaba aburrido y quería hacer una manera simple para que las personas puedan ingresar, finalizar, iniciar, detener o configurar en automático. Este archivo BAT simplemente 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 >> output.txt al final de la línea.

El% var% es solo una manera para que el usuario pueda ingresar su propio servicio en esto, en lugar de tener que ir a modificar el archivo bat cada vez que desee iniciar/detener un servicio diferente.

Si me equivoco, cualquiera puede corregirme este error.

@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 
+1

Normalmente, las respuestas con solo código no son apreciadas. ¿Podría explicar su solución o agregar algunos comentarios explicativos? –

+1

Creé esto hace un tiempo porque estaba aburrido y quería hacer una manera simple para que las personas puedan ingresar, finalizar, iniciar, detener o configurar en automático. Este archivo BAT simplemente solicita que ingrese el nombre del servicio y hará el resto por usted. –

2

Acabo de utilizar el ejemplo anterior de Jonas y he creado la lista completa de 0 a 24 niveles de error. Otra publicación es correcta que net start y net stop solo usan errorlevel 0 para el éxito y 2 para el 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% 

Cambio stop-start y funciona a la inversa.

1

El reinicio manual del servicio es correcto - services.msc tiene el botón "Reiniciar", pero en la línea de comandos los comandos sc y net carece de un "reinicio" y el reinicio está programado en el archivo cmd/bat, el servicio se detiene y se inicia inmediatamente, a veces se produce un error porque el servicio aún no se ha detenido, necesita algo de tiempo para cerrar las cosas.

Esto puede generar un error: sc detener sc start

Es una buena idea para insertar tiempo de espera, uso de ping (que pings cada 1 segundo): sc detener de ping localhost -n 60 sc start

Cuestiones relacionadas