Dừng và bắt đầu một dịch vụ thông qua tập tin lô hoặc cmd?


288

Làm cách nào tôi có thể kịch bản một con dơi hoặc cmd dừng lại và bắt đầu một dịch vụ đáng tin cậy bằng cách kiểm tra lỗi (hoặc cho tôi biết rằng nó không thành công vì bất kỳ lý do gì)?


Có thể hơi khó chịu (vì bạn yêu cầu hướng dẫn bat & cmd) nhưng: PowerShell cung cấp cho bạn nhiều quyền kiểm soát và phản hồi để thực hiện các hành động như thế này.
GvS

Câu trả lời:


347

Sử dụng lệnh SC(điều khiển dịch vụ), nó cung cấp cho bạn nhiều tùy chọn hơn so với chỉ start& stop.

  SỰ MIÊU TẢ:
          SC là một chương trình dòng lệnh được sử dụng để liên lạc với
          Kiểm soát dịch vụ NT và dịch vụ.
  SỬ DỤNG:
      sc <server> [lệnh] [tên dịch vụ] ...

      Tùy chọn <server> có dạng "\\ ServerName"
      Có thể nhận thêm trợ giúp về các lệnh bằng cách gõ: "sc [lệnh]"
      Các lệnh:
        truy vấn ----------- Truy vấn trạng thái cho một dịch vụ hoặc
                        liệt kê trạng thái cho các loại dịch vụ.
        queryex --------- Truy vấn trạng thái mở rộng cho một dịch vụ, hoặc
                        liệt kê trạng thái cho các loại dịch vụ.
        bắt đầu ----------- Bắt đầu một dịch vụ.
        tạm dừng ----------- Gửi yêu cầu kiểm soát PAUSE đến một dịch vụ.
        thẩm vấn ----- Gửi yêu cầu kiểm soát INTERROGATE đến một dịch vụ.
        tiếp tục -------- Gửi yêu cầu kiểm soát TIẾP TỤC đến một dịch vụ.
        dừng ------------ Gửi yêu cầu DỪNG đến một dịch vụ.
        config ---------- Thay đổi cấu hình của một dịch vụ (liên tục).
        mô tả ----- Thay đổi mô tả của một dịch vụ.
        thất bại --------- Thay đổi các hành động được thực hiện bởi một dịch vụ khi thất bại.
        qc -------------- Truy vấn thông tin cấu hình cho một dịch vụ.
        qdescription ---- Truy vấn mô tả cho một dịch vụ.
        qfailure -------- Truy vấn các hành động được thực hiện bởi một dịch vụ khi thất bại.
        xóa ---------- Xóa một dịch vụ (khỏi sổ đăng ký).
        tạo ---------- Tạo một dịch vụ. (thêm nó vào sổ đăng ký).
        kiểm soát --------- Gửi điều khiển đến một dịch vụ.
        sdshow ---------- Hiển thị mô tả bảo mật của dịch vụ.
        sdset ----------- Đặt mô tả bảo mật của dịch vụ.
        GetDisplayName - Nhận DisplayName cho một dịch vụ.
        GetKeyName ------ Nhận ServiceKeyName cho một dịch vụ.
        EnumDepend ------ liệt kê các phụ thuộc dịch vụ.

      Các lệnh sau không yêu cầu tên dịch vụ:
      sc <máy chủ> <lệnh> <tùy chọn>
        boot ------------ (ok | bad) Cho biết liệu lần khởi động cuối cùng có nên
                        được lưu dưới dạng cấu hình khởi động được biết đến cuối cùng
        Khóa ------------ Khóa cơ sở dữ liệu dịch vụ
        QueryLock ------- Truy vấn LockStatus cho Cơ sở dữ liệu SCManager
  THÍ DỤ:
          sc bắt đầu dịch vụ của tôi

1
Tôi đồng ý rằng điều này là tốt hơn so với bắt đầu / dừng ròng. Lưu ý rằng có một tùy chọn để chạm vào các dịch vụ trên các máy từ xa.
Lập trình viên ngoài vòng pháp luật

1
Câu trả lời chính xác. Nhưng bạn cần phải là quản trị viên để chạy 'SC start service'. Tôi đã tìm thấy một giải pháp cho vấn đề đó ở đây . (Câu trả lời được chấp nhận có chứa giải pháp)
Michael K.

56
Vấn đề với SC là lệnh trả về ngay lập tức chứ không phải sau khi hành động hoàn tất. Nếu bạn muốn khởi động lại một dịch vụ qua tệp bó (dừng rồi bắt đầu), dừng lại trả về ngay lập tức, bắt đầu sau đó không thành công vì dịch vụ không dừng. Net dừng / bắt đầu trở lại sau khi hành động hoàn tất, do đó không có vấn đề này.
Dom

Tôi đã mở cmd dưới dạng chế độ quản trị viên, gặp lỗi Cú pháp của lệnh này là: Dịch vụ NET STOP
Satish Singh

Có cách nào để kiểm tra xem dịch vụ có dừng đúng không ?? năm 2020?
Anand Varkey Philips

212
net start [serviceName]

net stop [serviceName]

cho bạn biết họ đã thành công hay thất bại khá rõ ràng. Ví dụ

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

More help is available by typing NET HELPMSG 3521.

Nếu chạy từ một tệp bó, bạn có quyền truy cập vào ERRORLEVEL của mã trả về. 0 chỉ sự thành công. Bất cứ điều gì cao hơn chỉ ra thất bại.

Là một tập tin bat , error.bat:

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

Đầu ra trông như thế này:

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

Mã trả lại

 - 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

Chỉnh sửa 20.04.2015

Mã trả về:

Lệnh NET không trả về mã trả về của lớp Win32_Service (Dịch vụ không hoạt động, hết thời gian yêu cầu dịch vụ, v.v.) và đối với nhiều lỗi sẽ chỉ trả về Errorlevel 2.

Nhìn vào đây: http://ss64.com/nt/net_service.html


1
NET không phải là chỉ dành riêng cho chức năng dịch vụ liên quan trong khi SC chỉ dành riêng cho chức năng dịch vụ liên quan.
Wernight

3
Câu trả lời này tốt hơn vì các khối lệnh "net" và đợi dịch vụ bắt đầu hoặc dừng trước khi tập lệnh bó tiếp tục thực thi.
Steven

Vì (như Chỉnh sửa nói) hầu hết thời gian errorleveltrả về là 2, hãy xem ở đây cách diễn giải kết quả lỗi .
HeyJude

28

Bạn có thể sử dụng lệnh NET START và sau đó kiểm tra biến môi trường ERRORLEVEL, vd

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

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết điều này từ đỉnh đầu, nhưng tôi nghĩ nó sẽ hoạt động.


8

Thay vì kiểm tra mã, điều này cũng hoạt động

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

7

Tôi đã tạo tệp bó cá nhân của mình cho việc này, của tôi hơi khác một chút nhưng hãy thoải mái sửa đổi khi bạn thấy phù hợp. Tôi đã tạo ra điều này một thời gian trước bởi vì tôi đã chán và muốn thực hiện một cách đơn giản để mọi người có thể nhập kết thúc, bắt đầu, dừng hoặc cài đặt thành tự động. Tệp BAT này chỉ yêu cầu bạn nhập tên dịch vụ và nó sẽ làm phần còn lại cho bạn. Tôi đã không nhận ra rằng anh ta đang tìm kiếm một cái gì đó có lỗi, tôi đã đọc sai phần đó. Mặc dù thông thường, điều này có thể được thực hiện bằng cách nhập >> output.txt vào cuối dòng.

% Var% chỉ là cách để người dùng có thể nhập dịch vụ của riêng họ vào đây, thay vì phải sửa đổi tệp bat mỗi khi bạn muốn bắt đầu / dừng dịch vụ khác.

Nếu tôi sai, bất cứ ai cũng có thể cảm thấy tự do để sửa chữa tôi về điều này.

@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
Thông thường, mã chỉ trả lời không được đánh giá cao. Bạn có thể giải thích về giải pháp của bạn hoặc thêm một số ý kiến ​​giải thích?
một tai nghe

2
Tôi đã tạo ra điều này một thời gian trước bởi vì tôi đã chán và muốn thực hiện một cách đơn giản để mọi người có thể nhập kết thúc, bắt đầu, dừng hoặc cài đặt thành tự động. Tệp BAT này chỉ yêu cầu bạn nhập tên dịch vụ và nó sẽ làm phần còn lại cho bạn.
Nathanial Wilson

6

Sử dụng mã trả về từ net startnet stopcó vẻ như là phương pháp tốt nhất với tôi. Hãy thử xem điều này: Mã trả về Net Start .


2
Các trang được liên kết không còn tồn tại. Như vậy, đây là một nhận xét nhiều hơn bây giờ.
Neolisk

5

Cú pháp luôn khiến tôi .... vì vậy ...

Đây là cách rõ ràng để thêm một dòng vào một tệp bó sẽ giết một dịch vụ từ xa (trên một máy khác) nếu bạn là quản trị viên trên cả hai máy, hãy chạy .bat với tư cách quản trị viên và các máy nằm trên cùng một miền. Tên máy theo định dạng UNC \ myserver

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

Trong trường hợp này ... p4_1 là cả Tên dịch vụ và Tên hiển thị, khi bạn xem Thuộc tính cho dịch vụ trong Trình quản lý dịch vụ. Bạn phải sử dụng Tên dịch vụ.

Đối với những người nghiện dịch vụ Ops của bạn ... hãy nhớ thêm mã lý do và nhận xét của bạn! tức là '4' tương đương với 'Đã lên kế hoạch' và nhận xét 'Dừng máy chủ để bảo trì'

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

1
Làm cách nào để làm điều này nếu tôi cần sử dụng ID người dùng và mật khẩu khác để đăng nhập?
Frantumn

1
Bạn chạy CMDnhư người dùng / ID khác bằng cách runas /user:Domain\UserName cmdnhập mật khẩu của bạn. CMD sẽ bắt đầu chạy như tài khoản người dùng được chỉ định.
dùng4317867

4

Chúng tôi muốn nghĩ rằng "net stop" sẽ dừng dịch vụ. Đáng buồn thay, thực tế không phải là màu đen và trắng. Nếu dịch vụ mất nhiều thời gian để dừng, lệnh sẽ quay trở lại trước khi dịch vụ dừng lại. Tuy nhiên, bạn sẽ không biết trừ khi bạn kiểm tra errorlevel.

Giải pháp có vẻ là vòng lặp tìm kiếm trạng thái của dịch vụ cho đến khi nó dừng lại, với một khoảng dừng mỗi lần vòng quanh vòng lặp.

Nhưng sau đó một lần nữa ...

Tôi đang thấy dịch vụ đầu tiên mất nhiều thời gian để dừng lại, sau đó "điểm dừng mạng" cho dịch vụ tiếp theo dường như không làm gì cả. Nhìn vào dịch vụ trong trình quản lý dịch vụ và trạng thái của dịch vụ vẫn là "Bắt đầu" - không thay đổi thành "Dừng". Tuy nhiên, tôi có thể dừng dịch vụ thứ hai này bằng tay bằng SCM và dịch vụ này dừng sau 3 hoặc 4 giây.


3

hoặc bạn có thể bắt đầu dịch vụ từ xa với cmd này: sc \\<computer> start <service>


3

Tôi vừa sử dụng ví dụ của Jonas ở trên và tạo danh sách đầy đủ từ 0 đến 24 lỗi. Bài đăng khác là chính xác net startnet stopchỉ sử dụng errorlevel0 cho thành công và 2 cho thất bại.

Nhưng đây là những gì làm việc cho tôi:

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%

Thay đổi stopđể startvà làm việc tại đảo ngược.


3

Khởi động lại dịch vụ thủ công là ok - services.msc có nút "Khởi động lại", nhưng trong dòng lệnh cả sc và lệnh net đều thiếu công tắc "khởi động lại" và nếu khởi động lại được lên lịch trong tệp cmd / bat, dịch vụ sẽ bị dừng và bắt đầu ngay lập tức gặp lỗi vì dịch vụ chưa dừng, cần một thời gian để tắt mọi thứ.

Điều này có thể tạo ra một lỗi: sc stop sc start

Đó là một ý tưởng tốt để chèn thời gian chờ, tôi sử dụng ping (nó cứ sau 1 giây): sc stop ping localhost -n 60 sc start


2

Đây là lệnh Windows 10 để bắt đầu Khôi phục hệ thống bằng cách sử dụng lô:

sc config swprv start= Auto

Bạn cũng có thể thích các lệnh đó:

  • Thay đổi giá trị đăng ký để tự động khởi động Khôi phục hệ thống

    ĐĂNG KÝ THÊM "HKLM \ PHẦN MỀM \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • Tạo một điểm khôi phục hệ thống

    Wmic.exe / Không gian tên: \ root \ default Path SystemRestore Call CreatRestorePoint "djibe đã lưu PC của bạn", 100, 12

  • Thay đổi sử dụng đĩa Khôi phục hệ thống

    vssadmin thay đổi kích thước bóng tối / for = C: / on = C: / maxsize = 10%

Thưởng thức


1

SC có thể làm mọi thứ với các dịch vụ ... bắt đầu, dừng, kiểm tra, định cấu hình và hơn thế nữa ...


1

Đôi khi bạn có thể thấy điểm dừng không hoạt động ..

Máy chủ của tôi đôi khi làm điều này. Sử dụng dòng lệnh sau đây sẽ giết chết nó. Nếu bạn thực sự cần kịch bản của mình để tiêu diệt những thứ không dừng lại. Tôi sẽ có nó làm điều này như là một phương sách cuối cùng

taskkill /pid [pid number] /f

0

Tôi đang viết một dịch vụ windows trong C #, vòng lặp dừng / gỡ cài đặt / xây dựng / cài đặt / bắt đầu đã quá mệt mỏi. Đã viết một tập lệnh nhỏ, gọi nó reploy.batvà bỏ vào thư mục đầu ra Visual Studio của tôi (tập lệnh có dịch vụ được xây dựng thực thi) để tự động hóa vòng lặp.

Chỉ cần đặt 3 vars này

servicename : cái này hiển thị trên bảng điều khiển Windows Service (services.msc)

slndir : thư mục (không phải đường dẫn đầy đủ) chứa tệp giải pháp (.sln) của bạn

binpath : đường dẫn đầy đủ (không phải đường dẫn thư mục) đến dịch vụ thực thi từ bản dựng

LƯU Ý: Điều này cần được chạy từ Dòng lệnh Nhà phát triển Visual Studio để msbuildlệnh hoạt động.

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%

Có lẽ điều này giúp được ai đó :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.