Arrêter et démarrer un service via un fichier batch ou cmd?

288

Comment puis-je script une batte ou cmd pour arrêter et démarrer un service de manière fiable avec vérification des erreurs (ou me faire savoir qu'il n'a pas réussi pour une raison quelconque)?

Keng
la source
Peut-être un peu hors sujet (puisque vous demandez des instructions bat & cmd) mais: PowerShell vous donne beaucoup de contrôle et de rétroaction pour effectuer des actions comme celle-ci.
GvS

Réponses:

347

Utilisez la commande SC(contrôle de service), elle vous offre beaucoup plus d'options que simplement start& stop.

  LA DESCRIPTION:
          SC est un programme en ligne de commande utilisé pour communiquer avec le
          Contrôleur de service NT et services.
  USAGE:
      sc <serveur> [commande] [nom du service] ...

      L'option <serveur> a la forme "\\ ServerName"
      Une aide supplémentaire sur les commandes peut être obtenue en tapant: "sc [commande]"
      Commandes:
        query ----------- Interroge l'état d'un service, ou
                        énumère l'état des types de services.
        queryex --------- Interroge l'état étendu d'un service, ou
                        énumère l'état des types de services.
        start ----------- Démarre un service.
        pause ----------- Envoie une demande de contrôle PAUSE à un service.
        interroger ----- Envoie une demande de contrôle INTERROGATE à un service.
        continue -------- Envoie une demande de contrôle CONTINUE à un service.
        stop ------------ Envoie une demande STOP à un service.
        config ---------- Modifie la configuration d'un service (persistant).
        description ----- Modifie la description d'un service.
        failure --------- Modifie les actions prises par un service en cas d'échec.
        qc -------------- Interroge les informations de configuration d'un service.
        qdescription ---- Interroge la description d'un service.
        qfailure -------- Interroge les actions prises par un service en cas d'échec.
        delete ---------- Supprime un service (du registre).
        create ---------- Crée un service. (l'ajoute au registre).
        control --------- Envoie un contrôle à un service.
        sdshow ---------- Affiche le descripteur de sécurité d'un service.
        sdset ----------- Définit le descripteur de sécurité d'un service.
        GetDisplayName - Obtient le DisplayName d'un service.
        GetKeyName ------ Obtient le ServiceKeyName pour un service.
        EnumDepend ------ Énumère les dépendances de service.

      Les commandes suivantes ne nécessitent pas de nom de service:
      sc <serveur> <commande> <option>
        boot ------------ (ok | bad) Indique si le dernier démarrage doit
                        être enregistré en tant que dernière configuration de démarrage connue
        Verrouiller ------------ Verrouille la base de données des services
        QueryLock ------- Interroge le LockStatus pour la base de données SCManager
  EXEMPLE:
          sc démarrer MyService
Ferruccio
la source
1
Je suis d'accord que c'est mieux que net start / stop. Notez qu'il existe également une option pour toucher les services sur les machines distantes.
Programmeur hors
1
Très bonne réponse. Mais vous devez être administrateur pour exécuter «SC start service». J'ai trouvé une solution pour cela ici . (La réponse acceptée contient la solution)
Michael K.
56
Le problème avec SC est que la commande revient immédiatement et non une fois l'action terminée. Si vous souhaitez redémarrer un service via un fichier batch (arrêter puis démarrer), l'arrêt revient immédiatement, le démarrage échoue alors car le service n'est pas arrêté. Net stop / start revient une fois l'action terminée, donc n'a pas ce problème.
Dom
J'ai ouvert le cmd en mode administrateur, obtenant une erreur La syntaxe de cette commande est: Service NET STOP
Satish Singh
existe-t-il un moyen de vérifier si le service est arrêté correctement ?? en 2020?
Anand Varkey Philips
212
net start [serviceName]

et

net stop [serviceName]

vous dire s'ils ont réussi ou échoué assez clairement. Par exemple

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

More help is available by typing NET HELPMSG 3521.

Si vous exécutez à partir d'un fichier de commandes, vous avez accès au NIVEAU D'ERREUR du code retour. 0 indique le succès. Une valeur plus élevée indique une défaillance.

En tant que fichier de chauve - souris, error.bat:

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

La sortie ressemble à ceci:

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 . . .

Codes de retour

 - 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

Modifier 20.04.2015

Codes de retour:

La commande NET ne renvoie pas les codes de retour de la classe Win32_Service documentés (Service non actif, délai d'expiration de la demande de service, etc.) et pour de nombreuses erreurs renvoie simplement Errorlevel 2.

Regardez ici: http://ss64.com/nt/net_service.html

Bill Michell
la source
1
NET n'est pas seulement pour les fonctions liées au service alors qu'il SC est juste pour les fonctions liées au service.
Wernight
3
Cette réponse est meilleure car les commandes "net" bloquent et attendent que le service démarre ou s'arrête avant que le script batch continue de s'exécuter.
Steven
Puisque (comme le dit l'Edit) la plupart du temps le errorlevelretour est 2, voyez ici comment interpréter le résultat de l'erreur .
HeyJude
28

Vous pouvez utiliser la commande NET START puis vérifier la variable d'environnement ERRORLEVEL, par exemple

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

Avertissement: j'ai écrit cela du haut de ma tête, mais je pense que cela fonctionnera.

Jonas Gulle
la source
8

Au lieu de vérifier les codes, cela fonctionne aussi

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  
vanval
la source
7

J'ai créé mon fichier batch personnel pour cela, le mien est un peu différent mais n'hésitez pas à le modifier comme bon vous semble. J'ai créé cela il y a peu de temps parce que je m'ennuyais et que je voulais proposer aux gens un moyen simple de saisir la fin, le démarrage, l'arrêt ou le réglage sur auto. Ce fichier BAT vous demande simplement d'entrer le nom du service et il fera le reste pour vous. Je ne savais pas qu'il cherchait quelque chose qui indiquait une erreur, j'ai dû mal lire cette partie. Bien que cela puisse généralement être fait en saisissant >> output.txt à la fin de la ligne.

Le% var% est juste un moyen pour l'utilisateur de pouvoir y entrer son propre service, au lieu d'avoir à modifier le fichier bat à chaque fois que vous voulez démarrer / arrêter un service différent.

Si je me trompe, n'importe qui peut se sentir libre de me corriger à ce sujet.

@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
Nathanial Wilson
la source
1
En règle générale, les réponses codées uniquement ne sont pas appréciées. Pourriez-vous développer votre solution ou ajouter quelques commentaires explicatifs?
un perce-oreille
2
J'ai créé cela il y a peu de temps parce que je m'ennuyais et que je voulais proposer aux gens un moyen simple de saisir la fin, le démarrage, l'arrêt ou le réglage sur auto. Ce fichier BAT vous demande simplement d'entrer le nom du service et il fera le reste pour vous.
Nathanial Wilson
6

Utiliser les codes retour de net startet net stopme semble être la meilleure méthode. Essayez ceci: Codes de retour Net Start .

ZombieSheep
la source
2
La page liée n'existe plus. En tant que tel, c'est plus un commentaire maintenant.
Neolisk
5

La syntaxe m'a toujours .... alors ...

Voici explicitement comment ajouter une ligne à un fichier de commandes qui tuera un service distant (sur une autre machine) si vous êtes administrateur sur les deux machines, exécutez le .bat en tant qu'administrateur et les machines sont sur le même domaine. Le nom de la machine suit le format UNC \ myserver

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

Dans ce cas ... p4_1 était à la fois le nom du service et le nom d'affichage lorsque vous affichez les propriétés du service dans Service Manager. Vous devez utiliser le nom du service.

Pour vos accros Service Ops ... assurez-vous d'ajouter votre code de raison et de commenter! c'est-à-dire '4' qui est égal à 'Planifié' et commentaire 'Arrêt du serveur pour maintenance'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
ATSiem
la source
1
Comment faire si je dois utiliser un autre ID utilisateur et mot de passe pour me connecter?
Frantumn
1
Vous exécutez en CMDtant que l'autre utilisateur / ID en faisant runas /user:Domain\UserName cmdpuis entrez votre mot de passe. CMD commencera à s'exécuter en tant que compte d'utilisateur spécifié.
user4317867
4

Nous aimerions penser que "net stop" arrêtera le service. Malheureusement, la réalité n'est pas si noire et blanche. Si le service met longtemps à s'arrêter, la commande revient avant l'arrêt du service. Cependant, vous ne le saurez pas, sauf si vous vérifiez le niveau d'erreur.

La solution semble être de boucler en rond à la recherche de l'état du service jusqu'à ce qu'il soit arrêté, avec une pause à chaque tour de boucle.

Mais encore une fois...

Je constate que le premier service prend beaucoup de temps à s'arrêter, puis le «net stop» pour un service ultérieur semble ne rien faire. Regardez le service dans le gestionnaire de services, et son état est toujours "Démarré" - aucun changement à "Arrêt". Pourtant, je peux arrêter ce deuxième service manuellement en utilisant le SCM, et il s'arrête en 3 ou 4 secondes.

DaveH
la source
3

ou vous pouvez démarrer le service à distance avec cette cmd: sc \\<computer> start <service>

onionpsie
la source
3

J'ai juste utilisé l'exemple de Jonas ci-dessus et créé une liste complète de 0 à 24 niveaux d'erreur. Les autres articles sont corrects net startet net stopn'utilisent queerrorlevel 0 pour le succès et 2 pour l'échec.

Mais c'est ce qui a fonctionné pour moi:

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%

Passez stopà startet fonctionne à l'envers.

Clinton
la source
3

Le redémarrage manuel du service est correct - services.msc a le bouton "Redémarrer", mais en ligne de commande les commandes sc et net n'ont pas de commutateur "redémarrer" et si le redémarrage est planifié dans le fichier cmd / bat, le service est arrêté et démarré immédiatement, parfois il obtient une erreur car le service n'est pas encore arrêté, il a besoin de temps pour arrêter les choses.

Cela peut générer une erreur: sc stop sc start

C'est une bonne idée d'insérer un timeout, j'utilise ping (ça sonne toutes les 1 secondes): sc stop ping localhost -n 60 sc start

Kuleris
la source
2

Voici la commande Windows 10 pour démarrer la restauration du système à l'aide d'un lot:

sc config swprv start= Auto

Vous pouvez également aimer ces commandes:

  • Modifier la valeur de Registre pour démarrer automatiquement la restauration du système

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

  • Créer un point de restauration système

    Wmic.exe / Namespace: \ root \ default Path SystemRestore Appelez CreateRestorePoint "djibe a sauvé votre PC", 100, 12

  • Modifier l'utilisation du disque de la restauration du système

    vssadmin resize shadowstorage / for = C: / on = C: / maxsize = 10%

Prendre plaisir

djibe
la source
1

SC peut tout faire avec les services ... démarrer, arrêter, vérifier, configurer et plus encore ...

Axeman
la source
1

Parfois, vous pouvez trouver l'arrêt ne fonctionne pas ..

Mon SQlServer fait parfois cela. L'utilisation de la ligne de commande suivante le tue. Si vous avez vraiment vraiment besoin de votre script pour tuer des trucs qui ne s'arrêtent pas. Je le ferais en dernier recours

taskkill /pid [pid number] /f
Andrew Pate
la source
0

J'écris un service Windows en C #, la boucle stop / uninstall / build / install / start est devenue trop fatigante. A écrit un mini script, l'a appelé reploy.batet déposé dans mon répertoire de sortie Visual Studio (celui qui a l'exécutable du service intégré) pour automatiser la boucle.

Réglez simplement ces 3 vars

servicename : cela apparaît sur le panneau de configuration du service Windows (services.msc)

slndir : dossier (pas le chemin complet) contenant votre fichier de solution (.sln)

binpath : chemin complet (pas le chemin du dossier) vers l'exécutable du service à partir de la build

REMARQUE: cela doit être exécuté à partir de la ligne de msbuildcommande de Visual Studio Developer pour que la commande fonctionne.

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%

Peut-être que cela aide quelqu'un :)

sh87
la source