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ì)?
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âu trả lời:
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
net start [serviceName]
và
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
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
là chỉ dành riêng cho chức năng dịch vụ liên quan.
errorlevel
trả về là 2, hãy xem ở đây cách diễn giải kết quả lỗi .
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.
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
Sử dụng mã trả về từ net start
và net stop
có 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 .
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
CMD
như người dùng / ID khác bằng cách runas /user:Domain\UserName cmd
nhậ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.
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.
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 start
và net stop
chỉ sử dụng errorlevel
0 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
để start
và làm việc tại đảo ngược.
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
Đâ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
Đô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
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.bat
và 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 để msbuild
lệ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 đó :)