ฉันจะสคริปต์ค้างคาวหรือ cmd เพื่อหยุดและเริ่มบริการได้อย่างน่าเชื่อถือด้วยการตรวจสอบข้อผิดพลาด (หรือแจ้งให้เราทราบว่ามันไม่ประสบความสำเร็จด้วยเหตุผลใดก็ตาม)
ฉันจะสคริปต์ค้างคาวหรือ cmd เพื่อหยุดและเริ่มบริการได้อย่างน่าเชื่อถือด้วยการตรวจสอบข้อผิดพลาด (หรือแจ้งให้เราทราบว่ามันไม่ประสบความสำเร็จด้วยเหตุผลใดก็ตาม)
คำตอบ:
ใช้SC
(การควบคุมบริการแล้ว) คำสั่งจะให้ตัวเลือกมากขึ้นกว่าเพียงและstart
stop
รายละเอียด: SC เป็นโปรแกรมบรรทัดคำสั่งที่ใช้สำหรับการสื่อสารกับ NT Service Controller และบริการ การใช้: sc <server> [คำสั่ง] [ชื่อบริการ] ... ตัวเลือก <server> มีรูปแบบ "\\ ServerName" สามารถรับความช่วยเหลือเพิ่มเติมเกี่ยวกับคำสั่งได้โดยพิมพ์: "sc [command]" คำสั่ง: แบบสอบถาม ----------- ค้นหาสถานะของบริการหรือ ระบุสถานะสำหรับประเภทของบริการ queryex --------- ค้นหาสถานะเพิ่มเติมสำหรับบริการหรือ ระบุสถานะสำหรับประเภทของบริการ start ----------- เริ่มบริการ หยุด ----------- ส่งคำร้องขอควบคุมชั่วคราวไปยังบริการ ซักถาม ----- ส่งคำร้องขอควบคุม INTERROGATE ไปยังบริการ ดำเนินการต่อ -------- ส่งคำขอควบคุมต่อไปยังบริการ หยุด ------------ ส่งคำขอ STOP ไปยังบริการ config ---------- เปลี่ยนการกำหนดค่าของบริการ (แบบต่อเนื่อง) คำอธิบาย ----- เปลี่ยนคำอธิบายของบริการ ความล้มเหลว --------- เปลี่ยนการกระทำที่ดำเนินการโดยบริการเมื่อล้มเหลว qc -------------- แบบสอบถามข้อมูลการกำหนดค่าสำหรับบริการ qdescription ---- ค้นหาคำอธิบายสำหรับบริการ qfailure -------- สอบถามการกระทำที่ดำเนินการโดยบริการเมื่อล้มเหลว ลบ ---------- ลบบริการ (จากรีจิสตรี) สร้าง ---------- สร้างบริการ (เพิ่มลงในรีจิสทรี) --------- ส่งการควบคุมไปยังบริการ sdshow ---------- แสดงตัวบอกเกี่ยวกับความปลอดภัยของบริการ sdset ----------- ตั้งค่าตัวบอกเกี่ยวกับความปลอดภัยของบริการ GetDisplayName - รับ DisplayName สำหรับบริการ GetKeyName ------ รับ ServiceKeyName สำหรับบริการ EnumDepend ------ ระบุการพึ่งพาการบริการ คำสั่งต่อไปนี้ไม่ต้องการชื่อบริการ: sc <server> <command> <option> boot ------------ (ok | bad) ระบุว่าการบูตครั้งสุดท้ายควร ถูกบันทึกเป็นการกำหนดค่าการบูตที่รู้จักกันดีครั้งสุดท้าย ล็อค ------------ ล็อคฐานข้อมูลบริการ QueryLock ------- ค้นหา LockStatus สำหรับฐานข้อมูล SCManager ตัวอย่าง: sc เริ่ม MyService
net start [serviceName]
และ
net stop [serviceName]
บอกคุณว่าพวกเขาประสบความสำเร็จหรือล้มเหลวอย่างชัดเจน ตัวอย่างเช่น
U:\>net stop alerter
The Alerter service is not started.
More help is available by typing NET HELPMSG 3521.
หากทำงานจากแบตช์ไฟล์คุณจะสามารถเข้าถึง ERRORLEVEL ของรหัสส่งคืนได้ 0 หมายถึงความสำเร็จ สิ่งใดที่สูงกว่าบ่งบอกถึงความล้มเหลว
เป็นไฟล์ bat error.bat
:
@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause
ผลลัพธ์มีลักษณะดังนี้:
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 . . .
รหัสส่งคืน
- 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
แก้ไข 20.04.2015
รหัสส่งคืน:
คำสั่ง NET จะไม่ส่งคืนรหัสการส่งคืนคลาส Win32_Service ที่ทำเป็นเอกสาร (Service Not Active, Service Request Timeout เป็นต้น) และสำหรับข้อผิดพลาดมากมายจะส่งคืน Errorlevel 2
ดูที่นี่: http://ss64.com/nt/net_service.html
NET
ไม่ได้เป็นเพียงสำหรับฟังก์ชั่นที่เกี่ยวข้องกับการให้บริการในขณะที่SC
เป็นเพียงสำหรับฟังก์ชั่นการบริการที่เกี่ยวข้อง
errorlevel
กลับมาเป็น 2, ดูที่นี่วิธีการตีความผลข้อผิดพลาด
คุณสามารถใช้คำสั่ง NET START จากนั้นตรวจสอบตัวแปรสภาพแวดล้อม ERRORLEVEL เช่น
net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%
คำเตือน: ฉันได้เขียนสิ่งนี้จากส่วนหัวของฉัน แต่ฉันคิดว่ามันจะได้ผล
แทนที่จะตรวจสอบรหัสก็ใช้งานได้เช่นกัน
net start "Apache tomcat" || goto ExitError
:End
exit 0
:ExitError
echo An error has occurred while starting the tomcat services
exit 1
ฉันได้สร้างไฟล์แบตช์ส่วนตัวของฉันสำหรับสิ่งนี้ฉันแตกต่างกันเล็กน้อย แต่อย่าลังเลที่จะแก้ไขตามที่คุณเห็นสมควร ฉันเพิ่งสร้างสิ่งนี้เมื่อไม่นานมานี้เพราะฉันรู้สึกเบื่อและอยากจะทำวิธีง่าย ๆ สำหรับคนที่จะสามารถป้อนจุดสิ้นสุดเริ่มหยุดหรือตั้งค่าอัตโนมัติ ไฟล์ BAT นี้เพียงแค่ขอให้คุณใส่ชื่อบริการและมันจะทำส่วนที่เหลือให้คุณ ฉันไม่ทราบว่าเขากำลังมองหาบางอย่างที่ระบุข้อผิดพลาดใด ๆ ฉันต้องอ่านส่วนนั้นผิด แม้ว่าโดยทั่วไปจะสามารถทำได้โดยการใส่ >> output.txt ที่ส่วนท้ายของบรรทัด
% var% เป็นเพียงวิธีการที่ผู้ใช้จะสามารถป้อนบริการของตนเองลงในสิ่งนี้ได้แทนที่จะต้องไปแก้ไขไฟล์ bat ทุกครั้งที่คุณต้องการเริ่ม / หยุดบริการอื่น
หากฉันผิดทุกคนสามารถแก้ไขฉันได้อย่างอิสระ
@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
การใช้รหัสส่งคืนจากnet start
และnet stop
ดูเหมือนจะเป็นวิธีที่ดีที่สุดสำหรับฉัน ลองดูที่นี้: สุทธิเริ่มต้นรหัสกลับมา
ไวยากรณ์ทำให้ฉันอยู่เสมอ .... ดังนั้น ...
นี่คือวิธีการเพิ่มบรรทัดลงในไฟล์แบทช์ที่จะฆ่าบริการระยะไกล (บนเครื่องอื่น) หากคุณเป็นผู้ดูแลระบบของทั้งสองเครื่องให้รัน. bat ในฐานะผู้ดูแลระบบและเครื่องอยู่ในโดเมนเดียวกัน ชื่อเครื่องตาม UNC format \ myserver
sc \\ip.ip.ip.ip stop p4_1
ในกรณีนี้ ... p4_1 เป็นทั้งชื่อบริการและชื่อที่แสดงเมื่อคุณดูคุณสมบัติของบริการใน Service Manager คุณต้องใช้ชื่อบริการ
สำหรับบริการ Ops ของคุณ ... อย่าลืมผนวกเหตุผลและความคิดเห็นของคุณ! เช่น '4' ซึ่งเท่ากับ 'วางแผน' และแสดงความคิดเห็น 'หยุดเซิร์ฟเวอร์เพื่อการบำรุงรักษา'
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
CMD
ในฐานะผู้ใช้ / ID อื่นโดยทำrunas /user:Domain\UserName cmd
แล้วป้อนรหัสผ่านของคุณ CMD จะเริ่มทำงานตามบัญชีผู้ใช้ที่ระบุ
เราต้องการคิดว่า "net stop" จะหยุดให้บริการ น่าเศร้าที่ความจริงไม่ใช่ขาวดำ หากบริการใช้เวลานานในการหยุดคำสั่งจะกลับมาก่อนที่บริการจะหยุด แม้ว่าคุณจะไม่รู้ยกเว้นว่าคุณตรวจสอบระดับข้อผิดพลาด
วิธีแก้ปัญหาดูเหมือนจะวนรอบเพื่อค้นหาสถานะของการบริการจนกว่ามันจะหยุดด้วยการหยุดชั่วคราวในแต่ละครั้งรอบวง
แต่แล้วอีกครั้ง ...
ฉันเห็นการให้บริการครั้งแรกใช้เวลานานในการหยุดจากนั้น "การหยุดสุทธิ" สำหรับบริการที่ตามมาดูเหมือนจะไม่ทำอะไรเลย ดูบริการในตัวจัดการบริการและสถานะยังคงเป็น "เริ่มต้น" - ไม่เปลี่ยนเป็น "หยุด" แต่ฉันสามารถหยุดบริการที่สองนี้ด้วยตนเองโดยใช้ SCM และจะหยุดใน 3 หรือ 4 วินาที
หรือคุณสามารถเริ่มบริการระยะไกลด้วย cmd นี้: sc \\<computer> start <service>
ฉันเพิ่งใช้ตัวอย่างของ Jonas ด้านบนและสร้างรายการข้อผิดพลาดระดับ 0 ถึง 24 ทั้งหมด โพสต์อื่น ๆ นั้นถูกต้องnet start
และnet stop
ใช้งานได้เท่านั้นerrorlevel
0 เพื่อความสำเร็จและ 2 สำหรับความล้มเหลว
แต่นี่คือสิ่งที่ทำงานสำหรับฉัน:
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%
เปลี่ยนstop
เป็นstart
และทำงานในสิ่งที่ตรงกันข้าม
การรีสตาร์ทบริการแบบแมนนวลนั้นใช้ได้ - services.msc มีปุ่ม "รีสตาร์ท" แต่ในบรรทัดคำสั่งทั้งคำสั่ง sc และ net ไม่มีสวิตช์ "รีสตาร์ท" และหากการรีสตาร์ทถูกกำหนดเวลาไว้ในไฟล์ cmd / bat การบริการจะหยุดและเริ่มต้นทันที ได้รับข้อผิดพลาดเนื่องจากบริการยังไม่หยุดทำงานมันต้องการเวลาในการปิดบางสิ่งบางอย่าง
สิ่งนี้อาจสร้างข้อผิดพลาด: sc stop sc start
เป็นความคิดที่ดีที่จะแทรกการหมดเวลาฉันใช้ ping (มันส่ง Ping ทุกๆ 1 วินาที): sc stop ping localhost -n 60 sc start
นี่คือคำสั่ง Windows 10 เพื่อเริ่มการคืนค่าระบบโดยใช้แบทช์:
sc config swprv start= Auto
คุณอาจชอบคำสั่งเหล่านั้น:
เปลี่ยนค่ารีจิสตรีเพื่อเริ่มการคืนค่าระบบโดยอัตโนมัติ
REG เพิ่ม "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v ปิดการใช้งาน / t REG_DWORD / t REG_DWORD / d 0 / f
สร้างจุดคืนค่าระบบ
Wmic.exe / Namespace: \ root \ default เส้นทาง SystemRestore Call CreateRestorePoint "djibe บันทึกพีซีของคุณ", 100, 12
เปลี่ยนการคืนค่าระบบการใช้ดิสก์
vssadmin ปรับขนาด shadowstorage / สำหรับ = C: / on = C: / maxsize = 10%
สนุก
SC
สามารถทำทุกอย่างด้วยบริการ ... เริ่มหยุดตรวจสอบกำหนดค่าและอื่น ๆ ...
บางครั้งคุณสามารถค้นหาหยุดไม่ทำงาน ..
SQlServer ของฉันทำเช่นนี้ในบางครั้ง การใช้ commandline ฆ่ามัน หากคุณต้องการสคริปต์ของคุณเพื่อฆ่าสิ่งที่ไม่หยุดยั้ง ฉันจะให้มันเป็นทางเลือกสุดท้าย
taskkill /pid [pid number] /f
ฉันกำลังเขียนบริการ windows ใน C #, ลูปหยุด / ถอนการติดตั้ง / สร้าง / ติดตั้ง / เริ่มได้เหนื่อยเกินไป เขียนมินิสคริปต์เรียกมันว่าreploy.bat
และดร็อปในไดเร็กทอรีเอาต์พุตของ Visual Studio (อันที่มีการปฏิบัติการของบริการ) เพื่อทำให้ลูปเป็นไปโดยอัตโนมัติ
เพียงตั้งค่า 3 vars เหล่านี้
servicename
: สิ่งนี้ปรากฏขึ้นบนแผงควบคุมของ Windows Service (services.msc)
slndir
: โฟลเดอร์ (ไม่ใช่พา ธ เต็ม) ที่มีไฟล์ solution (.sln) ของคุณ
binpath
: เส้นทางแบบเต็ม (ไม่ใช่เส้นทางโฟลเดอร์) ไปยังบริการที่สามารถเรียกทำงานได้จากบิลด์
หมายเหตุ: ต้องเรียกใช้จาก Visual Studio Developer Line Line เพื่อให้msbuild
คำสั่งทำงาน
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%
บางทีนี่อาจช่วยใครซักคน :)