Question

Comment puis-je envoyer un script à une chauve-souris ou à une cmd pour arrêter et démarrer un service de manière fiable avec un contrôle d'erreur (ou me laisser savoir qu'il n'a pas réussi pour une raison quelconque)?

Était-ce utile?

La solution

Utilisez la commande SC (service control), elle vous offre bien plus d’options que juste 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

Autres conseils

net start [serviceName]

et

net stop [serviceName]

vous dit 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 utilisez un fichier de commandes, vous avez accès à ERRORLEVEL du code de retour. 0 indique le succès. Quelque chose de plus élevé indique un échec.

En tant que fichier bat, 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

Modification du 20.04.2015

Codes de retour:

  

La commande NET ne renvoie pas les codes de retour documentés de la classe Win32_Service (service inactif, délai de demande de service, etc.) et renvoie souvent le niveau d'erreur 2 pour de nombreuses erreurs.

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

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%

Clause de non-responsabilité: j’ai écrit cela du fond de ma tête, mais je pense que cela fonctionnera.

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  

J'ai créé mon fichier de commandes personnel à cet effet. Le mien est un peu différent mais vous pouvez le modifier à votre guise. J'ai créé cela il y a quelque temps parce que je m'ennuyais et que je voulais proposer un moyen simple pour que les gens puissent saisir les fins de fin, de début, de fin, d'arrêter ou de régler sur auto. Ce fichier BAT vous demande simplement de saisir le nom du service et fera le reste à votre place. Je n'avais pas réalisé qu'il cherchait quelque chose qui indiquait une erreur, je dois avoir mal interprété cette partie. Bien que généralement cela puisse être fait en entrant & Gt; & Gt; output.txt à la fin de la ligne.

Le% var% n’est qu’un moyen pour l’utilisateur de pouvoir entrer son propre service dans celui-ci, 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

Utiliser les codes de retour de net start et net stop me semble la meilleure méthode. Essayez ceci: Codes de retour Net Start .

La syntaxe me donne toujours ... alors ...

Voici explicitement comment ajouter une ligne à un fichier de commandes qui va tuer un service distant (sur une autre machine) si vous êtes un administrateur sur les deux ordinateurs, exécutez le fichier .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 complet lorsque vous affichez les propriétés du service dans Service Manager. Vous devez utiliser le nom du service.

Pour les accros de votre service, assurez-vous d’ajouter votre code de motif et votre commentaire! c'est-à-dire '4', ce qui équivaut à 'Prévu' et au commentaire 'Arrêt du serveur pour maintenance'

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

Nous aimerions penser que & "net stop &"; va arrêter le service. Malheureusement, la réalité n'est pas que noir et blanc. Si le service met longtemps à s’arrêter, la commande reviendra avant que le service ne s’arrête. Vous ne saurez pas, cependant, à moins de vérifier le niveau d'erreur.

La solution semble être de faire une boucle autour de la recherche de l’état du service jusqu’à ce qu’il soit arrêté, avec une pause chaque fois autour de la boucle.

Mais encore une fois ...

Je vois que le premier service met beaucoup de temps à s’arrêter, puis le & "net stop &"; pour un service ultérieur semble simplement ne rien faire. Examinez le service dans le gestionnaire de services et son état est toujours & "Démarré &"; - pas de changement en & "Arrêter &"; Pourtant, je peux arrêter manuellement ce second service à l'aide du SCM, qui s'arrête en 3 ou 4 secondes.

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

Je viens d'utiliser l'exemple de Jonas ci-dessus et de créer une liste complète de 0 à 24 niveaux d'erreur. L’autre message indique que net start et net stop n’utilisent que errorlevel 0 pour réussir et 2 pour échouer.

Mais voici 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%

Remplacez stop par start et fonctionne en sens inverse.

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

Ceci peut générer une erreur: arrêt de sc sc start

C’est une bonne idée d’insérer un délai d’attente, j’utilise ping (il émet un ping toutes les secondes): arrêt de sc ping localhost -n 60 sc start

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

Parfois, vous pouvez trouver que 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 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

Voici la commande Windows 10 permettant de démarrer la restauration du système à l'aide de batch:

sc config swprv start= Auto

Vous pouvez également aimer ces commandes:

  • Modifiez la valeur de registre pour démarrer automatiquement la restauration du système

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

  • Créer un point de restauration du système

    Wmic.exe / Espace de noms: \ root \ default Chemin SystemRestore Appelez CreateRestorePoint & "djibe a sauvegardé votre PC &" ;,,,12,12

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

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

Profitez

J'écris un service Windows en C #, la boucle d'arrêt / désinstallation / construction / installation / démarrage est devenue trop fatigante. A écrit un mini-script, appelé reploy.bat et déposé dans mon répertoire de sortie Visual Studio (celui qui contient l'exécutable de service intégré) pour automatiser la boucle.

Il suffit de définir ces 3 vars

servicename: cela s'affiche dans 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 construction

REMARQUE: Cela doit être exécuté à partir de la ligne de commande de Visual Studio Developer pour que la commande msbuild 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:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top