Toplu iş veya cmd dosyası aracılığıyla bir hizmeti durdurup başlat?


288

Bir sopayı veya cmd'yi bir hizmeti hata denetimi ile güvenilir bir şekilde durdurmak ve başlatmak için nasıl komut dosyası oluşturabilirim (ya da herhangi bir nedenle başarılı olmadığını bana bildirin)?


Belki biraz oftopik (yarasa ve cmd talimatı istediğiniz için) ama: PowerShell size böyle eylemler yapmak için çok fazla kontrol ve geri bildirim sağlar.
GvS

Yanıtlar:


347

Kullanın SC(servis kontrol) komutu, bu size sadece çok daha fazla seçenek sunar startve stop.

  AÇIKLAMA:
          SC, iletişim kutusuyla iletişim kurmak için kullanılan bir komut satırı programıdır.
          NT Hizmet Denetleyicisi ve hizmetleri.
  KULLANIM:
      sc <server> [komut] [hizmet adı] ...

      <server> seçeneği "\\ SunucuAdı" biçiminde
      Komutlar hakkında daha fazla yardım "sc [command]" yazarak elde edilebilir.
      Komutlar:
        query ----------- Bir hizmetin durumunu sorgular veya
                        hizmet türlerinin durumunu listeler.
        queryex --------- Bir hizmetin genişletilmiş durumunu sorgular veya
                        hizmet türlerinin durumunu listeler.
        start ----------- Bir hizmet başlatır.
        pause ----------- Bir servise bir PAUSE kontrol isteği gönderir.
        interrogate ----- Bir servise INTERROGATE kontrol isteği gönderir.
        continue -------- Bir servise CONTINUE kontrol isteği gönderir.
        stop ------------ Bir servise DURDUR isteği gönderir.
        config ---------- Bir hizmetin yapılandırmasını değiştirir (kalıcı).
        description ----- Bir hizmetin açıklamasını değiştirir.
        fail --------- Bir servisin hata üzerine yaptığı işlemleri değiştirir.
        qc -------------- Bir hizmetin yapılandırma bilgilerini sorgular.
        qdescription ---- Bir hizmetin açıklamasını sorgular.
        qfailure -------- Bir hizmetin başarısız olması durumunda gerçekleştirdiği eylemleri sorgular.
        delete ---------- Bir hizmeti siler (kayıt defterinden).
        create ---------- Bir hizmet oluşturur. (kayıt defterine ekler).
        kontrol --------- Bir servise kontrol gönderir.
        sdshow ---------- Bir hizmetin güvenlik tanımlayıcısını görüntüler.
        sdset ----------- Bir hizmetin güvenlik tanımlayıcısını ayarlar.
        GetDisplayName - Bir hizmet için DisplayName değerini alır.
        GetKeyName ------ Bir hizmet için ServiceKeyName alır.
        EnumDepend ------ Hizmet Bağımlılıklarını numaralandırır.

      Aşağıdaki komutlar için bir hizmet adı gerekmez:
      sc <server> <komut> <seçenek>
        boot ------------ (ok | bad) Son önyüklemenin gerekip gerekmediğini gösterir
                        son bilinen iyi önyükleme yapılandırması olarak kaydedilebilir
        Kilitle ------------ Hizmet Veritabanını Kilitler
        QueryLock ------- SCManager Veritabanı için LockStatus'u sorgular
  MİSAL:
          sc MyService'i başlat

1
Bunun net start / stop'tan daha iyi olduğunu kabul ediyorum. Uzak makinelerde de servislere dokunma seçeneğinin bulunduğunu unutmayın.
Yasadışı Programcı

1
Mükemmel cevap. Ancak 'SC start service' uygulamasını çalıştırmak için yönetici olmanız gerekir. Burada bunun için bir çözüm buldum . (Kabul edilen cevap çözümü içerir)
Michael K.

56
SC ile ilgili sorun, komutun eylem tamamlandıktan sonra değil hemen dönmesidir. Bir hizmeti toplu iş dosyası aracılığıyla yeniden başlatmak istiyorsanız (durdur sonra başlat), durdurma hemen geri döner, hizmet durdurulmadığı için başlangıç ​​başarısız olur. Eylem tamamlandıktan sonra net durdurma / başlatma geri döner, bu nedenle bu sorun yoktur.
Dom

Cmd'yi yönetici modu olarak açtım, hata alıyorum Bu komutun sözdizimi: NET DURDUR hizmeti
Satish Singh

hizmet düzgün durdurulmuş olup olmadığını kontrol etmenin bir yolu var mı ?? 2020'de mi?
Anand Varkey Philips

212
net start [serviceName]

ve

net stop [serviceName]

başarılı ya da başarısız olup olmadıklarını anlatırlar. Örneğin

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

More help is available by typing NET HELPMSG 3521.

Bir toplu iş dosyasından çalıştırıyorsanız, dönüş kodunun ERRORLEVEL öğesine erişebilirsiniz. 0 başarıyı gösterir. Daha yüksek bir şey başarısızlığı gösterir.

Bir yarasa dosyası olarak error.bat:

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

Çıktı şöyle görünür:

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

Dönüş Kodları

 - 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

Düzenle 20.04.2015

Dönüş Kodları:

NET komutu belgelenen Win32_Service sınıfı dönüş kodlarını (Hizmet Etkin Değil, Hizmet İsteği Zaman Aşımı, vb.) Döndürmez ve birçok hata için Hata Düzeyi 2'yi döndürür.

Buraya bakın: http://ss64.com/nt/net_service.html


1
NET yalnızca hizmetle ilgili işlevler için değil SC , yalnızca hizmetle ilgili işlevler içindir.
Wernight

3
Bu yanıt daha iyidir çünkü "net" komutu engellenir ve toplu iş komut dosyası yürütülmeye devam etmeden önce hizmetin başlamasını veya durmasını bekler.
Steven

(Edit'in dediği gibi) çoğu zaman errorleveldöndürülen 2 olduğundan, hata sonucunun nasıl yorumlanacağına buradan bakın .
HeyJude

28

NET START komutunu kullanabilir ve ardından ERRORLEVEL ortam değişkenini kontrol edebilirsiniz, örn.

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

Feragatname: Bunu kafamın üstünden yazdım, ama bence işe yarayacak.


8

Kodları kontrol etmek yerine, bu da işe yarıyor

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

7

Bunun için kişisel toplu iş dosyamı oluşturdum, benimki biraz farklı ama uygun gördüğünüzde değiştirmekten çekinmeyin. Bunu biraz önce oluşturdum çünkü sıkıldım ve insanların bitiş, başlatma, durdurma veya otomatik olarak ayarlama girişlerini yapabilmeleri için basit bir yol yapmak istedim. Bu BAT dosyası sadece servis adını girmenizi ister ve gerisini sizin için yapar. Herhangi bir hata bildiren bir şey aradığının farkında değildim, o kısmı yanlış okumalıydım. Yine de bu genellikle satırın sonuna >> output.txt girilerek yapılabilir.

% Var%, farklı bir hizmeti her başlatmak / durdurmak istediğinizde yarasa dosyasını değiştirmek zorunda kalmak yerine, kullanıcının kendi hizmetini buna girebilmesinin bir yoludur.

Eğer yanılıyorsam, kimse beni bu konuda düzeltebilir.

@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

1
Tipik olarak, sadece kod cevapları takdir edilmez. Çözümünüz hakkında ayrıntılı bilgi verebilir veya açıklayıcı yorumlar ekleyebilir misiniz?
bir earwig

2
Bunu biraz önce oluşturdum çünkü sıkıldım ve insanların bitiş, başlatma, durdurma veya otomatik olarak ayarlama girişlerini yapabilmeleri için basit bir yol yapmak istedim. Bu BAT dosyası sadece servis adını girmenizi ister ve gerisini sizin için yapar.
Nathanial Wilson


5

Sözdizimi her zaman beni alır .... yani ...

Her iki makinede de bir yönetici iseniz, .bat'ı yönetici olarak çalıştırın ve makineler aynı etki alanındaysa, bir toplu iş dosyasına uzak bir hizmeti (başka bir makinede) öldürecek bir satırın nasıl ekleneceği açıktır. Makine adı UNC biçimini izliyor \ myserver

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

Bu durumda ... Service Manager'da hizmetin özelliklerini görüntülediğinizde p4_1 hem Hizmet Adı hem de Görünen Ad'dı. Hizmet Adını kullanmanız gerekir.

Hizmet Operasyon bağımlıları için ... neden kodunuzu eklediğinizden ve yorum yaptığınızdan emin olun! yani 'Planlanan'a eşit olan' 4 've' Bakım için sunucuyu durdurma '

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

1
Oturum açmak için başka bir kullanıcı kimliği ve şifre kullanmam gerekirse bunu nasıl yapabilirim?
Frantumn

1
Bunu CMDyaparak diğer kullanıcı / kimlik olarak çalıştırın ve runas /user:Domain\UserName cmdardından şifrenizi girin. CMD belirtilen kullanıcı hesabı olarak çalışmaya başlayacaktır.
user4317867

4

"Net stop" un hizmeti durduracağını düşünmek isteriz. Ne yazık ki, gerçeklik o kadar siyah ve beyaz değil. Hizmetin durması uzun sürerse, komut hizmet durmadan önce geri döner. Yine de, hata seviyesini kontrol etmezseniz bilemezsiniz.

Çözüm, döngü her seferinde bir duraklama ile, durdurulana kadar hizmetin durumunu aramak için döngü şeklinde dolaşmak gibi görünüyor.

Ama sonra tekrar...

Ben ilk hizmet durdurmak için uzun bir zaman alır görüyorum, sonra bir sonraki hizmet için "net stop" sadece hiçbir şey yapmak gibi görünüyor. Hizmet yöneticisinde servise bakın ve durumu hala "Başlatıldı" - "Durdurma" da değişiklik yok. Yine de bu ikinci servisi SCM kullanarak manuel olarak durdurabilirim ve 3 veya 4 saniye içinde durur.


3

veya bu cmd ile uzaktan hizmet başlatabilirsiniz: sc \\<computer> start <service>


3

Yukarıda Jonas'ın örneğini kullandım ve 0 ila 24 hata seviyesinin tam listesini oluşturdum. Diğer gönderi doğrudur net startve başarı için net stopsadece errorlevel0 ve başarısızlık için 2 kullanın .

Ama bu benim için işe yaradı:

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%

Değişim stopiçin startve ters içinde çalışır.


3

El ile hizmet yeniden başlatma tamam - services.msc "Yeniden Başlat" düğmesine sahiptir, ancak komut satırında hem sc hem de net komutlarında "yeniden başlatma" anahtarı yoktur ve cmd / bat dosyasında yeniden başlatma planlanmışsa, hizmet hemen durdurulur ve bazen başlatılır, bazen Hizmet henüz durdurulmadığı için hata alır, işleri kapatmak için biraz zamana ihtiyaç duyar.

Bu bir hata oluşturabilir: sc stop sc start

Zaman aşımı eklemek iyi bir fikir, ping kullanıyorum (her 1 saniyede ping yapıyor): sc stop ping localhost -n 60 sc start


2

İşte toplu iş kullanarak Sistem Geri Yükleme'yi başlatmak için Windows 10 komutu:

sc config swprv start= Auto

Bu komutları da beğenebilirsiniz:

  • Kayıt defteri değerini otomatik başlatma olarak değiştirme Sistem geri yükleme

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

  • Sistem geri yükleme noktası oluşturma

    Wmic.exe / Ad alanı: \ root \ default Yol SystemRestore CreateRestorePoint Çağrısı "djibe PC'nizi kaydetti", 100, 12

  • Sistem Geri Yükleme disk kullanımını değiştirme

    vssadmin yeniden boyutlandırma shadowstorage / for = C: / on = C: / maxsize =% 10

Zevk almak


1

SC hizmetler ile her şeyi yapabilir ... başlat, durdur, kontrol et, yapılandır ve daha fazlası ...


1

Bazen durağın işe yaramadığını görebilirsiniz ..

Benim SQlServer bazen bunu yapar. Aşağıdaki komut satırını kullanmak onu öldürür. Gerçekten durmayan şeyleri öldürmek için betiğinize ihtiyacınız varsa. Bunu son çare olarak yapardım

taskkill /pid [pid number] /f

0

C # 'da bir Windows hizmeti yazıyorum, stop / uninstall / build / install / start döngüsü çok yorucu. Mini bir komut dosyası yazdı, adlandırdı reploy.batve döngüyü otomatikleştirmek için Visual Studio çıktı dizinime (yerleşik hizmet çalıştırılabilir bir tane) düştü.

Sadece bu 3 çeşidi ayarlayın

servicename : bu, Windows Hizmeti kontrol panelinde (services.msc) görünür

slndir : (tam yol değil) çözümünüzü içeren klasör (.sln)

binpath : yapıdan çalıştırılabilir hizmetin tam yolu (klasör yolu değil)

Not: Bu msbuildkomutun çalışması için Visual Studio Developer komut satırından çalıştırılması gerekir .

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%

Belki bu birine yardımcı olur :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.