sc - Administrar servicios
El comando sc administra los servicios de Windows. Un servicio es un programa que sigue ejecutándose en segundo plano sin que nadie inicie sesión, como la impresión, Windows Update o las funciones de red.
Con sc puede comprobar el estado de un servicio, iniciarlo y detenerlo, y cambiar su tipo de inicio (automático, manual o deshabilitado) solo desde la línea de comandos. No necesita abrir la ventana de Servicios (services.msc), lo que también hace que sc sea ideal para archivos por lotes.
Sintaxis básica del comando sc
sc <comando> <nombre del servicio> [opciones]
El primer argumento indica qué hacer, seguido del nombre del servicio de destino. Los comandos principales son los siguientes.
| Comando | Descripción |
|---|---|
sc query | Muestra el estado de un servicio |
sc qc | Muestra la configuración de un servicio (tipo de inicio, etc.) |
sc start | Inicia un servicio |
sc stop | Detiene un servicio |
sc pause | Pausa un servicio |
sc continue | Reanuda un servicio pausado |
sc config | Cambia la configuración de un servicio (tipo de inicio, etc.) |
sc create | Registra un servicio nuevo |
sc delete | Elimina el registro de un servicio |
En Windows PowerShell 5.1, sc es un alias del cmdlet Set-Content. Escribir sc query Spooler allí no administra servicios, así que incluya la extensión, como en sc.exe query Spooler. Los comandos de este artículo suponen que los ejecuta en el Símbolo del sistema.
Nombre del servicio y nombre para mostrar
Cada servicio tiene un nombre para mostrar que aparece en services.msc (por ejemplo, Print Spooler) y un nombre de servicio distinto que se usa en los comandos (por ejemplo, Spooler). sc utiliza el nombre de servicio.
La salida de sc query muestra el nombre del servicio (SERVICE_NAME) junto al nombre para mostrar (DISPLAY_NAME), así que puede relacionarlos.
Comprobar el estado de un servicio
Ejecute sc query con el nombre del servicio.
sc query Spooler
STATE es el estado actual. Los valores principales son los siguientes.
| Valor de STATE | Significado |
|---|---|
RUNNING | En ejecución |
STOPPED | Detenido |
START_PENDING | Iniciándose |
STOP_PENDING | Deteniéndose |
PAUSED | En pausa |
Si ejecuta sc query sin nombre de servicio, se muestra la lista de servicios en ejecución. Para incluir también los detenidos, especifique state= all.
sc query type= service state= all
Las opciones de sc necesitan un espacio justo después del =, como en type= service. Escribir type=service produce un error. No ponga un espacio antes del =.
Cuando la lista es larga, combínela con more o find para leerla mejor.
sc query type= service state= all | find "SERVICE_NAME"
Comprobar la configuración de un servicio
sc qc (query config) muestra el tipo de inicio y la ruta del ejecutable.
sc qc Spooler
START_TYPE muestra el tipo de inicio y BINARY_PATH_NAME muestra el ejecutable del servicio.
Iniciar y detener un servicio
Use sc start para iniciar un servicio y sc stop para detenerlo.
sc start Spooler
sc stop Spooler
Iniciar, detener y reconfigurar un servicio normalmente requiere permisos de administrador. Si lo ejecuta en un Símbolo del sistema normal, aparece “Acceso denegado” (error 5). Consulte el artículo relacionado para saber cómo ejecutar como administrador. Comprobar el estado (sc query) funciona sin permisos de administrador.
sc stop solo envía una solicitud de detención y no espera a que el servicio termine de detenerse. Justo después puede aparecer STOP_PENDING, así que espere un momento y use sc query para confirmar que haya llegado a STOPPED.
Reiniciar un servicio
sc no tiene un comando de reinicio, así que detenga el servicio y vuelva a iniciarlo. Inserte timeout para darle tiempo a detenerse.
@echo off
sc stop Spooler
timeout /t 3 /nobreak >nul
sc start Spooler
Algunos servicios tardan más de 3 segundos en detenerse. Cuando necesite estar seguro, use la técnica “Esperar un estado” que se describe más abajo.
Diferencias con net start y net stop
net start <nombre del servicio> y net stop <nombre del servicio> también pueden iniciar y detener servicios.
net stop Spooler
net start Spooler
net stop espera a que el servicio se detenga antes de devolver el control. Además, detiene los servicios que dependen de él, después de pedir confirmación. Si solo quiere detener e iniciar un servicio, net es más cómodo. Si también necesita comprobar el estado o cambiar la configuración, sc es la mejor opción.
Cambiar el tipo de inicio
La opción start= de sc config cambia lo que ocurre al iniciar Windows.
sc config Spooler start= demand
| Valor | Tipo de inicio |
|---|---|
auto | Automático |
delayed-auto | Automático (inicio retrasado) |
demand | Manual |
disabled | Deshabilitado |
Si deshabilita un servicio, las funciones que dependen de él dejarán de estar disponibles a partir del siguiente inicio. No cambie la configuración de un servicio que no comprenda. Anote la configuración actual con sc qc antes de cambiar nada para poder restaurarla.
Errores y cómo resolverlos
Cuando sc falla, muestra un mensaje con un número de error, como [SC] OpenService FAILED 1060:.
| Error | Causa habitual y solución |
|---|---|
| 5 | Acceso denegado. Ejecute como administrador |
| 1056 | El servicio ya se está ejecutando. Compruebe el estado con sc query |
| 1060 | El servicio no existe. Compruebe que usó el nombre del servicio y no el nombre para mostrar |
| 1058 | No se puede iniciar porque está deshabilitado. Cambie el tipo de inicio con sc config |
| 1062 | El servicio no se ha iniciado (intentó detener uno que ya estaba detenido) |
Puede consultar el significado de un número de error con net helpmsg, como en net helpmsg 1060.
Comprobar el estado en un archivo por lotes
Buscar en la salida de sc query con find le indica si un servicio se está ejecutando.
@echo off
sc query Spooler | find "RUNNING" >nul
if errorlevel 1 (
echo Print Spooler esta detenido.
) else (
echo Print Spooler se esta ejecutando.
)
find devuelve el código de salida 0 cuando encuentra una línea coincidente y 1 cuando no, así que if errorlevel 1 gestiona el caso “no encontrado”. Los valores de STATE están en inglés sea cual sea el idioma de Windows, por lo que el mismo código funciona en cualquier idioma.
Esperar un estado
Para esperar a que termine un inicio o una detención, compruebe repetidamente hasta que el estado alcance el valor deseado.
@echo off
sc stop Spooler >nul
:wait
sc query Spooler | find "STOPPED" >nul
if errorlevel 1 (
timeout /t 1 /nobreak >nul
goto wait
)
echo Detenido.
Si el servicio no puede detenerse, este ejemplo espera para siempre. En un uso real, es más seguro fijar un número máximo de intentos con una variable contador.
Registrar y eliminar un servicio
sc create registra su propio programa como servicio. Indique la ruta del ejecutable en binPath=.
sc create MyService binPath= "C:\tools\myservice.exe" start= demand
Cuando ya no lo necesite, elimine el registro con sc delete.
sc delete MyService
sc delete elimina el registro del servicio sin pedir confirmación. Eliminar un servicio incluido en Windows puede dejar el sistema sin poder funcionar correctamente. Úselo solo con servicios que haya registrado usted mismo.
Tenga en cuenta que un programa o archivo por lotes normal no funciona como servicio tal cual. Para ejecutarse como servicio, un programa debe poder responder a las solicitudes del Administrador de control de servicios.
Resumen
| Lo que quiere hacer | Comando |
|---|---|
| Comprobar el estado de un servicio | sc query <nombre del servicio> |
| Listar todos los servicios | sc query type= service state= all |
| Comprobar el tipo de inicio | sc qc <nombre del servicio> |
| Iniciar un servicio | sc start <nombre del servicio> |
| Detener un servicio | sc stop <nombre del servicio> |
| Cambiar el tipo de inicio | sc config <nombre del servicio> start= demand |
| Comprobar si se está ejecutando | sc query <nombre del servicio> | find "RUNNING" |
| Registrar o eliminar un servicio | sc create / sc delete |