¿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?
Respuesta
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
¡ese vertedero de pantalla acaba de ganar el premio! gracias, ¡ni siquiera sabía sobre 'sc'! – Keng
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. –
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) –
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.
La página vinculada ya no existe. Como tal, esto es más un comentario ahora. – Neolisk
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
¡Esta es la respuesta que deberíamos ver más! Buen trabajo. – Pokus
No todos son míos: los códigos de devolución provienen de una edición de comunidad ... –
Bueno, es una buena respuesta. Gracias un montón. –
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á.
Funciona para mí, gracias @Jonas – MikeRoger
SC
puede hacer todo con los servicios ... iniciar, detener, revisar, configurar y más ...
o se puede iniciar el servicio remoto con este cmd: sc \\<computer> start <service>
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
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
¿Cómo hago esto si necesito usar otra identificación de usuario y contraseña para iniciar sesión? – Frantumn
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
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.
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
Normalmente, las respuestas con solo código no son apreciadas. ¿Podría explicar su solución o agregar algunos comentarios explicativos? –
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. –
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.
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
- 1. Detener un servicio de Windows que depende de otro servicio a través del archivo por lotes
- 2. Inicie un servicio de Windows e inicie el cmd
- 3. Ejecute el archivo por lotes como un servicio de Windows
- 4. Incluir un archivo por lotes en un archivo por lotes
- 5. Iniciar varias aplicaciones de consola desde un archivo por lotes
- 6. Archivo por lotes para reiniciar un servicio. Windows
- 7. "@ php_bin @" no se reconoce como un comando interno o externo, programa operable o archivo por lotes
- 8. Detener e iniciar un servicio según el estado de la aplicación
- 9. Archivo por lotes para ejecutar un comando en cmd dentro de un directorio
- 10. ¿Cómo detener un servicio de Windows mediante programación?
- 11. ejecutar un archivo por lotes desde C#
- 12. ¿Cómo puedo iniciar Cassini Web Server desde una línea de comando o un archivo por lotes?
- 13. Iniciar y detener IIS Express mediante programación
- 14. ¿Cómo iniciar/detener un cronjob usando PHP?
- 15. ¿Detener el archivo por lotes hasta que se complete la parada del servicio?
- 16. Cómo iniciar y detener un Continuamente Correr Trabajador de fondo mediante un botón de
- 17. Cómo crear un archivo por lotes para ejecutar cmd como administrador
- 18. ¿Cómo ocultar la ventana de cmd mientras se ejecuta un archivo por lotes?
- 19. Cómo reiniciar Rails en Mongrel, sin detener e iniciar Mongrel
- 20. Iniciar un proceso en una nueva ventana desde un archivo por lotes
- 21. ¿Cuál es el directorio actual en un archivo por lotes?
- 22. Reiniciar mediante programación un servicio de Windows
- 23. Detener e iniciar IIS programáticamente. Forma rápida y segura
- 24. ¿Cuánto demora ejecutar un archivo por lotes?
- 25. 'otra cosa' no se reconoce como un comando interno o externo, programa o archivo por lotes
- 26. ¿Cómo iniciar un servicio de Android desde una actividad y detener el servicio en otra actividad?
- 27. Cómo detener/iniciar un servicio que contiene un bucle infinito en la creación
- 28. ¿Cómo comprobar si un servicio se está ejecutando a través de un archivo por lotes e iniciarlo, si no se está ejecutando?
- 29. 'easy_install' no se reconoce como un comando interno o externo, programa operable o archivo por lotes
- 30. Cómo iniciar/detener un servicio de Windows desde una aplicación ASP.NET - Problemas de seguridad
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