Berhenti dan Mulai layanan melalui file batch atau cmd?

288

Bagaimana saya bisa skrip kelelawar atau cmd untuk berhenti dan memulai layanan andal dengan pengecekan kesalahan (atau beri tahu saya bahwa itu tidak berhasil karena alasan apa pun)?

Keng
sumber
Mungkin agak offtopic (karena Anda meminta instruksi bat & cmd) tetapi: PowerShell memberi Anda banyak kontrol dan umpan balik untuk melakukan tindakan seperti ini.
GvS

Jawaban:

347

Gunakan perintah SC(kontrol layanan), ini memberi Anda lebih banyak opsi daripada hanya start& stop.

  DESKRIPSI:
          SC adalah program baris perintah yang digunakan untuk berkomunikasi dengan
          Pengontrol Layanan NT dan layanan.
  PEMAKAIAN:
      sc <server> [perintah] [nama layanan] ...

      Opsi <server> memiliki bentuk "\\ ServerName"
      Bantuan lebih lanjut tentang perintah dapat diperoleh dengan mengetik: "sc [command]"
      Perintah:
        permintaan ----------- Menanyakan status layanan, atau
                        menyebutkan status untuk jenis layanan.
        queryex --------- Permintaan status diperluas untuk layanan, atau
                        menyebutkan status untuk jenis layanan.
        mulai ----------- Memulai layanan.
        jeda ----------- Mengirim permintaan kontrol PAUSE ke layanan.
        menginterogasi ----- Mengirim permintaan kontrol INTERROGATE ke layanan.
        lanjutkan -------- Mengirim permintaan kontrol LANJUTKAN ke layanan.
        berhenti ------------ Mengirim permintaan STOP ke layanan.
        config ---------- Mengubah konfigurasi layanan (persisten).
        description ----- Mengubah deskripsi layanan.
        kegagalan --------- Mengubah tindakan yang diambil oleh layanan setelah kegagalan.
        qc -------------- Menanyakan informasi konfigurasi untuk layanan.
        qdescription ---- Menanyakan deskripsi untuk layanan.
        qfailure -------- Menanyakan tindakan yang dilakukan oleh layanan setelah kegagalan.
        hapus ---------- Menghapus layanan (dari registri).
        buat ---------- Membuat layanan. (menambahkannya ke registri).
        control --------- Mengirim kontrol ke layanan.
        sdshow ---------- Menampilkan deskriptor keamanan layanan.
        sdset ----------- Menetapkan deskriptor keamanan layanan.
        GetDisplayName - Mendapat DisplayName untuk layanan.
        GetKeyName ------ Mendapat ServiceKeyName untuk layanan.
        EnumDepend ------ Menghitung Ketergantungan Layanan.

      Perintah berikut ini tidak memerlukan nama layanan:
      sc <server> <command> <option>
        boot ------------ (ok | buruk) Menunjukkan apakah booting terakhir harus
                        disimpan sebagai konfigurasi boot terakhir yang dikenal baik
        Kunci ------------ Mengunci Database Layanan
        QueryLock ------- Menanyakan LockStatus untuk Database SCManager
  CONTOH:
          sc mulai MyService
Ferruccio
sumber
1
Saya setuju bahwa ini lebih baik daripada start / stop net. Perhatikan bahwa ada opsi untuk menyentuh layanan pada mesin jarak jauh juga.
Outlaw Programmer
1
Jawaban yang bagus Tetapi Anda harus menjadi administrator untuk menjalankan 'layanan mulai SC'. Saya menemukan solusi untuk itu di sini . (Jawaban yang diterima berisi solusi)
Michael K.
56
Masalah dengan SC adalah bahwa perintah kembali segera dan tidak setelah tindakan selesai. Jika Anda ingin memulai kembali layanan melalui file batch (berhenti lalu mulai), berhenti segera kembali, mulai kemudian gagal karena layanan tidak berhenti. Stop / start net kembali setelah tindakan selesai, jadi tidak memiliki masalah ini.
Dom
Saya membuka cmd sebagai mode administrator, mendapatkan kesalahan Sintaks dari perintah ini adalah: NET STOP service
Satish Singh
apakah ada cara untuk memeriksa apakah layanan dihentikan dengan benar ?? pada tahun 2020?
Anand Varkey Philips
212
net start [serviceName]

dan

net stop [serviceName]

memberi tahu Anda apakah mereka berhasil atau gagal dengan cukup jelas. Sebagai contoh

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

More help is available by typing NET HELPMSG 3521.

Jika dijalankan dari file batch, Anda memiliki akses ke ERRORLEVEL dari kode kembali. 0 menunjukkan kesuksesan. Apa pun yang lebih tinggi mengindikasikan kegagalan.

Sebagai file bat, error.bat:

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

Outputnya terlihat seperti ini:

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

Kembalikan Kode

 - 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

Sunting 20.04.2015

Kembali kode:

Perintah NET tidak mengembalikan kode pengembalian kelas Win32_Service yang terdokumentasi (Layanan Tidak Aktif, Timeout Permintaan Layanan, dll.) Dan untuk banyak kesalahan hanya akan mengembalikan Errorlevel 2.

Lihat di sini: http://ss64.com/nt/net_service.html

Bill Michell
sumber
1
NET tidak hanya untuk fungsi layanan terkait sementara SC ini hanya untuk fungsi layanan terkait.
Wernight
3
Jawaban ini lebih baik karena perintah "bersih" memblokir dan menunggu layanan untuk memulai atau berhenti sebelum skrip batch terus dijalankan.
Steven
Karena (seperti Edit mengatakan) sebagian besar waktu yang errorleveldikembalikan adalah 2, lihat di sini bagaimana menafsirkan hasil kesalahan .
HeyJude
28

Anda dapat menggunakan perintah NET START dan kemudian memeriksa variabel lingkungan ERRORLEVEL, misalnya

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

Penafian: Saya sudah menulis ini dari atas kepala saya, tetapi saya pikir itu akan berhasil.

Jonas Gulle
sumber
8

Alih-alih memeriksa kode, ini juga berfungsi

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

Saya telah membuat file batch pribadi saya untuk ini, milik saya sedikit berbeda tetapi merasa bebas untuk memodifikasi sesuai keinginan Anda. Saya membuat ini beberapa waktu yang lalu karena saya bosan dan ingin membuat cara sederhana agar orang dapat memasukkan akhir, mulai, berhenti, atau pengaturan ke otomatis. File BAT ini hanya meminta Anda memasukkan nama layanan dan akan melakukan sisanya untuk Anda. Saya tidak menyadari bahwa dia sedang mencari sesuatu yang menyatakan kesalahan, saya pasti salah membaca bagian itu. Meskipun biasanya ini dapat dilakukan dengan memasukkan >> output.txt pada akhir baris.

% Var% hanyalah cara bagi pengguna untuk dapat memasukkan layanan mereka sendiri ke dalam ini, alih-alih harus memodifikasi file bat setiap kali Anda ingin memulai / menghentikan layanan yang berbeda.

Jika saya salah, siapa pun dapat merasa bebas untuk memperbaiki saya dalam hal ini.

@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
sumber
1
Biasanya, kode hanya jawaban yang tidak dihargai. Bisakah Anda menguraikan solusi Anda atau menambahkan beberapa komentar penjelasan?
an earwig
2
Saya membuat ini beberapa waktu yang lalu karena saya bosan dan ingin membuat cara sederhana agar orang dapat memasukkan akhir, mulai, berhenti, atau pengaturan ke otomatis. File BAT ini hanya meminta Anda memasukkan nama layanan dan akan melakukan sisanya untuk Anda.
Nathanial Wilson
6

Menggunakan kode kembali dari net startdan net stopsepertinya metode terbaik bagi saya. Coba lihat ini: Net Mulai kode pengembalian .

ZombieSheep
sumber
2
Halaman tertaut tidak ada lagi. Karena itu, ini lebih banyak komentar sekarang.
Neolisk
5

Sintaks selalu membuatku .... jadi ...

Di sini secara eksplisit cara menambahkan baris ke file batch yang akan mematikan layanan jarak jauh (di komputer lain) jika Anda seorang admin di kedua mesin, jalankan .bat sebagai administrator, dan mesin berada di domain yang sama. Nama mesin mengikuti format UNC \ myserver

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

Dalam hal ini ... p4_1 adalah Nama Layanan dan Nama Tampilan, saat Anda melihat Properti untuk layanan di Manajer Layanan. Anda harus menggunakan Nama Layanan.

Untuk pecandu Layanan Ops Anda ... pastikan untuk menambahkan kode alasan dan komentar Anda! yaitu '4' yang sama dengan 'Direncanakan' dan komentar 'Menghentikan server untuk pemeliharaan'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
ATSiem
sumber
1
Bagaimana saya melakukan ini jika saya perlu menggunakan ID pengguna dan kata sandi lain untuk masuk?
Frantumn
1
Anda menjalankan CMDsebagai pengguna / ID lain dengan melakukan runas /user:Domain\UserName cmdlalu masukkan kata sandi Anda. CMD akan mulai berjalan sebagai akun pengguna yang ditentukan.
user4317867
4

Kami ingin berpikir bahwa "stop net" akan menghentikan layanan. Sayangnya, kenyataan tidak hitam dan putih. Jika layanan membutuhkan waktu lama untuk berhenti, perintah akan kembali sebelum layanan berhenti. Anda tidak akan tahu, kecuali Anda memeriksa tingkat kesalahan.

Solusinya tampaknya untuk loop mencari kondisi layanan sampai dihentikan, dengan jeda setiap kali putaran loop.

Tapi sekali lagi ...

Saya melihat layanan pertama membutuhkan waktu yang lama untuk berhenti, kemudian "penghentian bersih" untuk layanan selanjutnya tampaknya tidak melakukan apa pun. Lihatlah layanan di manajer layanan, dan kondisinya masih "Memulai" - tidak ada perubahan menjadi "Berhenti". Namun saya dapat menghentikan layanan kedua ini secara manual menggunakan SCM, dan berhenti dalam 3 atau 4 detik.

DaveH
sumber
3

atau Anda dapat memulai layanan jarak jauh dengan cmd ini: sc \\<computer> start <service>

onionpsy
sumber
3

Saya baru saja menggunakan contoh Jonas di atas dan membuat daftar lengkap 0 hingga 24 tingkat kesalahan. Posting lain benar net startdan net stophanya menggunakan errorlevel0 untuk sukses dan 2 untuk kegagalan.

Tetapi inilah yang berhasil bagi saya:

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%

Ubah stopke startdan bekerja secara terbalik.

Clinton
sumber
3

Restart layanan manual ok - service.msc memiliki tombol "Restart", tetapi dalam baris perintah perintah sc dan net tidak memiliki sakelar "restart" dan jika restart dijadwalkan dalam file cmd / bat, layanan dihentikan dan mulai segera, kadang-kadang mendapat kesalahan karena layanan belum berhenti, perlu waktu untuk mematikannya.

Ini dapat menghasilkan kesalahan: sc stop sc start

Adalah ide bagus untuk menyisipkan batas waktu, saya menggunakan ping (ping setiap 1 detik): sc stop ping localhost -n 60 sc start

Kuleris
sumber
2

Berikut adalah perintah Windows 10 untuk memulai Pemulihan Sistem menggunakan batch:

sc config swprv start= Auto

Anda mungkin juga menyukai perintah-perintah itu:

  • Ubah nilai registri untuk secara otomatis memulai Pemulihan sistem

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

  • Buat titik pemulihan sistem

    Wmic.exe / Namespace: \ root \ default Path SystemRestore Call CreateRestorePoint "djibe menyelamatkan PC Anda", 100, 12

  • Ubah Pemulihan Sistem penggunaan disk

    vssadmin mengubah ukuran shadowstorage / for = C: / on = C: / maxsize = 10%

Nikmati

djibe
sumber
1

SC dapat melakukan segalanya dengan layanan ... mulai, berhenti, periksa, konfigurasikan, dan lainnya ...

Axeman
sumber
1

Kadang-kadang Anda dapat menemukan berhenti tidak berfungsi ..

SQlServer saya terkadang melakukan ini. Menggunakan baris perintah berikut akan membunuhnya. Jika Anda benar-benar membutuhkan skrip Anda untuk membunuh hal-hal yang tidak berhenti. Saya ingin ini melakukan ini sebagai pilihan terakhir

taskkill /pid [pid number] /f
andrew pate
sumber
0

Saya menulis layanan windows di C #, loop stop / uninstall / build / install / start terlalu melelahkan. Menulis skrip mini, menyebutnya reploy.batdan menjatuhkannya di direktori output Visual Studio saya (yang memiliki layanan dibangun yang dapat dieksekusi) untuk mengotomatiskan loop.

Cukup atur 3 vars ini

servicename : ini muncul di panel kontrol Layanan Windows (services.msc)

slndir : folder (bukan path lengkap) yang berisi file solution (.sln) Anda

binpath : path lengkap (bukan path folder) ke layanan yang dapat dieksekusi dari build

CATATAN: Ini perlu dijalankan dari Baris Perintah Pengembang Visual Studio agar msbuildperintah berfungsi.

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%

Mungkin ini membantu seseorang :)

sh87
sumber