Arrêter et démarrer un service via un fichier batch ou cmd?
14 réponses
Utilisez la commande SC
(service control), elle vous donne beaucoup plus d'options que 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
net start [serviceName]
Et
net stop [serviceName]
Vous dire si elles 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 batch, vous avez accès au niveau D'erreur du code de retour. 0 indique le succès. Tout ce qui est plus élevé indique un échec.
Comme un 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 . . .
Les 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:
Le NET la commande ne renvoie pas les codes de retour de classe win32_service documentés (Service non actif, délai D'attente de demande de Service, etc.) et pour de nombreuses erreurs retournera simplement Errorlevel 2.
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%
Disclaimer: j'ai écrit ceci du haut de ma tête, mais je pense que ça va marcher.
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 batch personnel pour cela, le mien est un peu différent mais n'hésitez pas à modifier comme bon vous semble.
J'ai créé cela il y a un peu de temps parce que je m'ennuyais et que je voulais faire un moyen simple pour que les gens puissent entrer Fin, démarrage, arrêt de ou réglage de sur auto . Ce fichier BAT demande simplement que vous entrez le nom du service et il fera le reste pour vous. Je ne savais pas qu'il cherchait quelque chose qui disait toute erreur, je dois avoir mal lu cette partie. Bien que cela puisse généralement être fait en entrant >> output.txt
à la fin de la ligne.
Le %var%
est juste un moyen pour l'utilisateur de pouvoir entrer son propre service dans cela, 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
L'utilisation des codes de retour de net start
et net stop
me semble être la meilleure méthode. Essayez un coup d'oeil à ceci: NET Start return codes.
La syntaxe m'obtient toujours.... si...
Ici est explicitement comment ajouter une ligne dans un fichier batch qui va tuer un service distant (sur une autre machine) si vous êtes un 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 Service Nom.
Pour vos accros aux opérations de Service... assurez-vous d'ajouter votre code de raison et commentaire! c'est-à-dire '4' qui équivaut à 'planifié' et comment 'arrêter le serveur pour la maintenance'
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
Nous aimerions penser que "NET stop" arrêtera le service. Malheureusement, la réalité n'est pas que noir et blanc. Si le service prend beaucoup de temps pour s'arrêter, la commande reviendra avant que le service ne s'arrête. Vous ne saurez pas, cependant, sauf si vous vérifiez errorlevel.
La solution semble être de faire une boucle à 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 le premier service prendre beaucoup de temps pour stop, alors le "net stop" pour un service ultérieur semble juste ne rien faire. Regardez le service dans le gestionnaire de services, et son état est toujours "démarré" - pas de changement à "arrêter". Pourtant, je peux arrêter ce deuxième service manuellement en utilisant le SCM, et il s'arrête en 3 ou 4 secondes.
Ou vous pouvez démarrer le service à distance avec ce cmd: sc \\<computer> start <service>
Je viens d'utiliser L'exemple de Jonas ci-dessus et j'ai créé une liste complète de 0 à 24 niveaux d'erreur. Un autre message est correct que net start
et net stop
n'utilisent que errorlevel
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%
Changez stop
en start
et fonctionne à l'envers.
Le redémarrage manuel du service est ok-services.msc a le bouton" Restart", mais en ligne de commande, les commandes sc et net manquent d'un commutateur "restart" 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 faut du 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 délai d'attente, j'utilise ping (il ping toutes les 1 seconde): sc stop ping localhost-n 60 SC start
SC
peut tout faire avec les services... démarrer, arrêter, contrôler, configurer, et plus encore...
Parfois, vous pouvez trouver l'arrêt ne fonctionne pas..
Mon serveur SQL le fait parfois. L'utilisation de la ligne de commande suivante le tue. Si vous avez vraiment besoin de votre script pour tuer des choses qui ne s'arrêtent pas. Je voudrais le faire en dernier recours
taskkill /pid [pid number] /f
J'écris un service windows en C#, la boucle stop/uninstall/build/install/start 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 a l'exécutable de service construit) pour automatiser la boucle.
Il suffit de définir 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 solution (.sln) fichier
binpath
: chemin complet (pas le chemin du dossier) à l'exécutable de service à partir de la construction
Remarque: Ceci doit être exécuté à partir de la ligne de commande 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 :)