หยุดและเริ่มบริการผ่านแบตช์หรือไฟล์ cmd?


288

ฉันจะสคริปต์ค้างคาวหรือ cmd เพื่อหยุดและเริ่มบริการได้อย่างน่าเชื่อถือด้วยการตรวจสอบข้อผิดพลาด (หรือแจ้งให้เราทราบว่ามันไม่ประสบความสำเร็จด้วยเหตุผลใดก็ตาม)


อาจจะค่อนข้างไม่สุภาพ (เนื่องจากคุณขอคำสั่ง bat & cmd) แต่: PowerShellให้การควบคุมและข้อเสนอแนะสำหรับการดำเนินการเช่นนี้
GvS

คำตอบ:


347

ใช้SC(การควบคุมบริการแล้ว) คำสั่งจะให้ตัวเลือกมากขึ้นกว่าเพียงและstartstop

  รายละเอียด:
          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

1
ฉันยอมรับว่านี่ดีกว่าการเริ่มต้น / หยุดสุทธิ โปรดทราบว่ามีตัวเลือกในการแตะบริการบนเครื่องระยะไกลเช่นกัน
Outlaw Programmer

1
คำตอบที่ดี แต่คุณต้องเป็นผู้ดูแลระบบจึงจะสามารถใช้งาน 'SC start service' ฉันพบวิธีแก้ปัญหาสำหรับที่นี่ (คำตอบที่ได้รับการยอมรับมีวิธีแก้ปัญหา)
Michael K.

56
ปัญหากับ SC คือคำสั่งส่งคืนทันทีและไม่หลังจากการดำเนินการเสร็จสมบูรณ์ หากคุณต้องการเริ่มบริการใหม่โดยใช้ไฟล์แบตช์ (หยุดแล้วเริ่ม) การหยุดส่งคืนทันทีการเริ่มต้นจะล้มเหลวเนื่องจากบริการไม่หยุด Net stop / start คืนกลับมาหลังจากการดำเนินการเสร็จสมบูรณ์ดังนั้นจึงไม่มีปัญหานี้
Dom

ฉันเปิด cmd เป็นโหมดผู้ดูแลระบบได้รับข้อผิดพลาดไวยากรณ์ของคำสั่งนี้คือ: บริการ NET STOP
Satish Singh

มีวิธีการตรวจสอบว่าบริการหยุดอย่างถูกต้องหรือไม่? ในปี 2020
Anand Varkey Philips

212
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


1
NET ไม่ได้เป็นเพียงสำหรับฟังก์ชั่นที่เกี่ยวข้องกับการให้บริการในขณะที่SC เป็นเพียงสำหรับฟังก์ชั่นการบริการที่เกี่ยวข้อง
Wernight

3
คำตอบนี้ดีกว่าเพราะคำสั่ง "net" บล็อกและรอให้บริการเริ่มหรือหยุดก่อนสคริปต์ชุดทำงานต่อไป
Steven

ตั้งแต่ (ตามที่กล่าวแก้ไข) มากที่สุดของเวลาที่errorlevelกลับมาเป็น 2, ดูที่นี่วิธีการตีความผลข้อผิดพลาด
HeyJude

28

คุณสามารถใช้คำสั่ง 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%

คำเตือน: ฉันได้เขียนสิ่งนี้จากส่วนหัวของฉัน แต่ฉันคิดว่ามันจะได้ผล


8

แทนที่จะตรวจสอบรหัสก็ใช้งานได้เช่นกัน

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

7

ฉันได้สร้างไฟล์แบตช์ส่วนตัวของฉันสำหรับสิ่งนี้ฉันแตกต่างกันเล็กน้อย แต่อย่าลังเลที่จะแก้ไขตามที่คุณเห็นสมควร ฉันเพิ่งสร้างสิ่งนี้เมื่อไม่นานมานี้เพราะฉันรู้สึกเบื่อและอยากจะทำวิธีง่าย ๆ สำหรับคนที่จะสามารถป้อนจุดสิ้นสุดเริ่มหยุดหรือตั้งค่าอัตโนมัติ ไฟล์ 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

1
โดยทั่วไปโค้ดไม่ได้รับคำตอบเท่านั้น คุณช่วยอธิบายเกี่ยวกับวิธีแก้ปัญหาของคุณหรือเพิ่มความคิดเห็นที่อธิบายได้บ้างไหม?
Earwig

2
ฉันเพิ่งสร้างสิ่งนี้เมื่อไม่นานมานี้เพราะฉันรู้สึกเบื่อและอยากจะทำวิธีง่าย ๆ สำหรับคนที่จะสามารถป้อนจุดสิ้นสุดเริ่มหยุดหรือตั้งค่าอัตโนมัติ ไฟล์ BAT นี้เพียงแค่ขอให้คุณใส่ชื่อบริการและมันจะทำส่วนที่เหลือให้คุณ
Nathanial Wilson

6

การใช้รหัสส่งคืนจากnet startและnet stopดูเหมือนจะเป็นวิธีที่ดีที่สุดสำหรับฉัน ลองดูที่นี้: สุทธิเริ่มต้นรหัสกลับมา


2
หน้าเชื่อมโยงไม่มีอยู่อีกต่อไป เช่นนี้เป็นความคิดเห็นเพิ่มเติมในขณะนี้
Neolisk

5

ไวยากรณ์ทำให้ฉันอยู่เสมอ .... ดังนั้น ...

นี่คือวิธีการเพิ่มบรรทัดลงในไฟล์แบทช์ที่จะฆ่าบริการระยะไกล (บนเครื่องอื่น) หากคุณเป็นผู้ดูแลระบบของทั้งสองเครื่องให้รัน. 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

1
ฉันจะทำสิ่งนี้ได้อย่างไรถ้าฉันต้องใช้ ID ผู้ใช้และรหัสผ่านอื่นเพื่อเข้าสู่ระบบ?
Frantumn

1
คุณเรียกใช้CMDในฐานะผู้ใช้ / ID อื่นโดยทำrunas /user:Domain\UserName cmdแล้วป้อนรหัสผ่านของคุณ CMD จะเริ่มทำงานตามบัญชีผู้ใช้ที่ระบุ
user4317867

4

เราต้องการคิดว่า "net stop" จะหยุดให้บริการ น่าเศร้าที่ความจริงไม่ใช่ขาวดำ หากบริการใช้เวลานานในการหยุดคำสั่งจะกลับมาก่อนที่บริการจะหยุด แม้ว่าคุณจะไม่รู้ยกเว้นว่าคุณตรวจสอบระดับข้อผิดพลาด

วิธีแก้ปัญหาดูเหมือนจะวนรอบเพื่อค้นหาสถานะของการบริการจนกว่ามันจะหยุดด้วยการหยุดชั่วคราวในแต่ละครั้งรอบวง

แต่แล้วอีกครั้ง ...

ฉันเห็นการให้บริการครั้งแรกใช้เวลานานในการหยุดจากนั้น "การหยุดสุทธิ" สำหรับบริการที่ตามมาดูเหมือนจะไม่ทำอะไรเลย ดูบริการในตัวจัดการบริการและสถานะยังคงเป็น "เริ่มต้น" - ไม่เปลี่ยนเป็น "หยุด" แต่ฉันสามารถหยุดบริการที่สองนี้ด้วยตนเองโดยใช้ SCM และจะหยุดใน 3 หรือ 4 วินาที


3

หรือคุณสามารถเริ่มบริการระยะไกลด้วย cmd นี้: sc \\<computer> start <service>


3

ฉันเพิ่งใช้ตัวอย่างของ 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และทำงานในสิ่งที่ตรงกันข้าม


3

การรีสตาร์ทบริการแบบแมนนวลนั้นใช้ได้ - services.msc มีปุ่ม "รีสตาร์ท" แต่ในบรรทัดคำสั่งทั้งคำสั่ง sc และ net ไม่มีสวิตช์ "รีสตาร์ท" และหากการรีสตาร์ทถูกกำหนดเวลาไว้ในไฟล์ cmd / bat การบริการจะหยุดและเริ่มต้นทันที ได้รับข้อผิดพลาดเนื่องจากบริการยังไม่หยุดทำงานมันต้องการเวลาในการปิดบางสิ่งบางอย่าง

สิ่งนี้อาจสร้างข้อผิดพลาด: sc stop sc start

เป็นความคิดที่ดีที่จะแทรกการหมดเวลาฉันใช้ ping (มันส่ง Ping ทุกๆ 1 วินาที): sc stop ping localhost -n 60 sc start


2

นี่คือคำสั่ง 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%

สนุก


1

SC สามารถทำทุกอย่างด้วยบริการ ... เริ่มหยุดตรวจสอบกำหนดค่าและอื่น ๆ ...


1

บางครั้งคุณสามารถค้นหาหยุดไม่ทำงาน ..

SQlServer ของฉันทำเช่นนี้ในบางครั้ง การใช้ commandline ฆ่ามัน หากคุณต้องการสคริปต์ของคุณเพื่อฆ่าสิ่งที่ไม่หยุดยั้ง ฉันจะให้มันเป็นทางเลือกสุดท้าย

taskkill /pid [pid number] /f

0

ฉันกำลังเขียนบริการ 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%

บางทีนี่อาจช่วยใครซักคน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.