यह कैसे जांचें कि क्या कोई सेवा बैच फ़ाइल के माध्यम से चल रही है और इसे शुरू करें, अगर यह नहीं चल रहा है?


90

मैं एक बैच फ़ाइल लिखना चाहता हूं जो निम्नलिखित संचालन करती है:

  • जांचें कि क्या कोई सेवा चल रही है
    • यदि यह चल रहा है, तो बैच छोड़ दें
    • यदि यह नहीं चल रहा है, तो सेवा शुरू करें

अब तक जिन कोड के नमूने मैंने लिए थे, वे काम नहीं कर रहे थे, इसलिए मैंने उन्हें पोस्ट नहीं करने का फैसला किया।

एक सेवा शुरू करके किया जाता है:

net start "SERVICENAME"
  1. यदि कोई सेवा चल रही है, और बैचफ़ाइल में एक स्टेटमेंट कैसे बना सकता है, तो मैं कैसे जांच सकता हूं?
  2. मैं थोड़ा उलझन में हूँ। नेट शुरू करने के लिए मुझे क्या तर्क देना होगा? सेवा का नाम या उसका प्रदर्शन नाम?

3
गंदी प्रोग्रामिंग: जब केवल एक चीज जो आप करना चाहते हैं वह सेवा शुरू करना है यदि यह नहीं चल रहा है, तो बस स्टार्ट कमांड जारी करें। यदि यह नहीं चल रहा है तो यह सेवा शुरू कर देगा। यदि यह आपसे एक त्रुटि संदेश प्राप्त कर रहा है, लेकिन सेवा चल रही है (और बंद नहीं होती है)। गंदा लेकिन यह काम करता है। हालांकि, जब आप अन्य टिप्पणियों को निष्पादित करना चाहते हैं, यदि आपको सेवा शुरू करनी थी, तो निश्चित रूप से एलसी से क्लीनर संस्करण के साथ जाएं।
पीटर शुएत्ज़े

@Peter Schuetze: यदि सेवा शुरू करना ही एकमात्र उद्देश्य है, तो आपकी आपत्ति सही है। मैंने यह भी शामिल किया कि लॉगिंग एट वगैरह शुरू होता है, इसलिए मैंने एलसी के समाधान के साथ चिपका दिया।
सिट्रोनस

जवाबों:


163

किसी सेवा की स्थिति की जांच करने के लिए, का उपयोग करें sc query <SERVICE_NAME>। यदि बैच फ़ाइलों में ब्लॉक है, तो दस्तावेज़ की जाँच करें

निम्न कोड सेवा की स्थिति की जांच करेगा MyServiceNameऔर इसे चालू करेगा यदि यह नहीं चल रहा है (यदि सेवा नहीं चल रही है तो ब्लॉक को निष्पादित किया जाएगा):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

यह क्या करता है की व्याख्या:

  1. सेवा के गुणों को बताता है।
  2. "STATE" टेक्स्ट वाले लाइन को देखता है
  3. उस लाइन को टोकन करता है, और 3rd टोकन को खींचता है, जो कि सेवा की स्थिति से युक्त है।
  4. स्ट्रिंग "रनिंग" के विरुद्ध परिणामी अवस्था का परीक्षण

आपके दूसरे प्रश्न का सवाल है, तर्क आप को भेजना चाहते हैं जाएगा net startसेवा का नाम, है प्रदर्शन नाम।


बहुत बढ़िया। आपके प्रयास के लिए धन्यवाद। दुर्भाग्य से यह काम नहीं करता है? शायद मैं इसके लिए बहुत बेवकूफ हूं। मैंने "MyServiceName" को "SCardSvr" के साथ बदल दिया (बच गया) एक परीक्षण के रूप में, सब कुछ एक बैचफाइल में डाल दिया, इसे निष्पादित किया, लेकिन सेवा शुरू नहीं हुई। यहां तक ​​कि अगर मैं नेट प्रारंभ को किसी अन्य चीज़ से प्रतिस्थापित करता हूं, जैसे कि फ़ाइल में प्रिंट करना, तो इसे निष्पादित नहीं किया जाएगा। क्या आप कृपया दूसरा रूप लेना चाहेंगे? =)
सिट्रोनस

उफ़ मेरे पास पहली पंक्ति में कुछ अतिरिक्त सामान था ... यह कोशिश करो। और अगर यह काम नहीं करता है, तब क्या होता है जब आप sc query "SCardSvr"कमांड लाइन से चलते हैं ?
एलसी।

1
क्या आपके पास उद्धरण में "SCardSvr" है? मेरा मानना ​​है कि यह नहीं होना चाहिए,
LittleBobbyTables - Au Revoir

@LittleBobbyTables: आप सही हैं। बिना उद्धरण के यह काम किया। मैं बहुत बेवकूफ हूँ: - | आपकी मदद के लिए धन्यवाद
साइट्रोनस

@ नोट करने के लिए अच्छा है। मुझे लगता है कि लक्ष्य ओएस की भाषा के लिए आपको उस स्ट्रिंग को बदलना होगा जो भी इसकी आवश्यकता है। मैं "रूनिंग" भी मानता हूं।
एलसी।

34

किसी सेवा को चालू करने के लिए निम्नलिखित का उपयोग करें;

NET START "वितरित लेनदेन समन्वयक" || NET STOP "वितरित लेनदेन समन्वयक"


1
यह प्रारंभ से बाहर निकलने के कोड के कारण काम करता है। यदि प्रारंभ आदेश विफल रहता है, तो यह संभवत: इसलिए है क्योंकि यह पहले से चल रहा है (और बाद में इसे रोकना भी चोट नहीं पहुंचाएगा), इसलिए आप इसे रोकने का प्रयास करते हैं।
एलसी।

3
कमांड को इस तरह संरचित किया जाता है कि यदि नेट प्रारंभ विफल हो जाता है, तो वह इसे रोक देता है (इसके कारण (जिसका अर्थ है कि अन्य)), लेकिन यदि नेट प्रारंभ होता है, तो नेट स्टॉप फ्लॉप निष्पादित करता है। प्रतिभाशाली!
डॉक्टर DOS

1
यह मेरी राय में सबसे अच्छा जवाब है, और शायद @ साइट्रोनस को इसे स्वीकृत उत्तर के रूप में चिह्नित करने पर विचार करना चाहिए: सरल, स्मार्ट और सुरुचिपूर्ण, और स्टैकऑवरफ्लो जैसी साइट पर फिट बैठता है। इसे सरल बनाओ!
सूपालाजो डे एरियेरेज़

2
नाइटपिकी नहीं होना (ठीक है, शायद थोड़ा सा), लेकिन ||वास्तव में एक ORऑपरेटर है, हालांकि इस मामले में यह कार्यात्मक रूप से एक ELSEबयान है। यह एक सूक्ष्म, लेकिन महत्वपूर्ण अंतर है। फिर भी मेरा +1 मिला - मैं यह हर समय यूनिक्स / लिनक्स शेल स्क्रिप्टिंग में करता हूं, पता नहीं क्यों मैंने विंडोज बैच में ऐसा करने के बारे में कभी नहीं सोचा।
डग आर।

यह खतरनाक रूप से ओवरसाइज़्ड लगता है। मैं कभी भी किसी ऐसी चीज का उपयोग नहीं करना चाहता जिसे मैं बैच प्रोसेसिंग के लिए ऑटोमेट कर रहा था या किसी और को उपयोग करने के लिए दे रहा था ... लेकिन यह सिर्फ डॉक्टर ने एक त्वरित आइकन के लिए आदेश दिया है जिसे मैं अपने डेस्कटॉप पर एक सेवा के लिए रख सकता हूं जो मुझे चाहिए। जल्दी से अब और फिर टॉगल करें।
जोएल कोएहॉर्न

19

आप निम्न कमांड का उपयोग करके देख सकते हैं कि कोई सेवा चल रही है या नहीं:

sc query [ServiceName] | findstr /i "STATE"

जब मैं इसे अपने NOD32 एंटीवायरस के लिए चलाता हूं, तो मुझे यह मिलता है:

STATE                       : 4 RUNNING

अगर इसे रोका गया, तो मुझे मिलेगा:

STATE                       : 1 STOPPED

आप इसका उपयोग किसी चर में कर सकते हैं, फिर यह निर्धारित कर सकते हैं कि आप NET START का उपयोग करते हैं या नहीं।

सेवा का नाम सेवा नाम होना चाहिए, प्रदर्शन नाम नहीं।


1
आपकी मदद के लिए धन्यवाद, जो आपने पोस्ट किया था, उसे एकीकृत करने की कोशिश करते हुए, मैं अपने बैच कौशल को
बढ़ा


10

भाषा स्वतंत्र संस्करण।

@Echo Off
Set ServiceName=Jenkins


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName%

    Net start "%ServiceName%">nul||(
        Echo "%ServiceName%" wont start 
        exit /b 1
    )
    echo "%ServiceName%" started
    exit /b 0
)||(
    echo "%ServiceName%" working
    exit /b 0
)

हां! "अंतरिक्ष" हमेशा आपकी पीठ में अचानक हिट करता है!
१६:१६ पर

2
लगभग सही जवाब। मैं इस लाइन को ठीक करूँगा: नेट की शुरुआत "% ServiceName%"> nul || (
सेसर

मैंने स्क्रिप्ट को सार्वभौमिक बना दिया है इसलिए यह मुझे विंडोज शेड्यूलर कार्यों में उपयोग करने की अनुमति देता है। बस के Set ServiceName=Jenkinsसाथ बदलें Set ServiceName=%~1और इसे कॉल करेंwatch-service.bat "Jenkins"
डॉ

@ Ant_222 यह 'क्वेरी' के बजाय 'क्वेरी' का उपयोग करता है जो भाषा पर निर्भर है। और आपको क्यों लगता है कि यह विंडोज बैच नहीं है? क्या आपने इसका उपयोग करने की कोशिश की है?

5

मैं सिर्फ इस धागे को पाया और चर्चा को जोड़ना चाहता था यदि व्यक्ति सेवाओं को पुनः आरंभ करने के लिए एक बैच फ़ाइल का उपयोग नहीं करना चाहता है। विंडोज में एक विकल्प है यदि आप सेवाओं, सेवा गुणों पर जाते हैं, तो पुनर्प्राप्ति। यहां आप सेवा के लिए पैरामीटर सेट कर सकते हैं। यदि सेवा बंद हो जाती है तो सेवा को पुनरारंभ करना पसंद है। इसके अलावा, आप कंप्यूटर को पुनरारंभ करने के रूप में कुछ अलग करने का दूसरा असफल प्रयास भी कर सकते हैं।


2
यह एक उपयोगी उत्तर है, हालांकि, यह नोट करना महत्वपूर्ण है, यह केवल तभी काम करेगा जब सेवा निकास (-1) के साथ बंद हो गई हो। यदि सेवा इनायत (त्रुटि संदेश के साथ भी) से बाहर हो जाती है, तो ऑटो पुनर्प्राप्त ट्रिगर नहीं होगा। यह भी ट्रिगर नहीं होगा यदि सेवा उपयोगकर्ता द्वारा मैन्युअल रूप से मार दी गई थी।
आर्ट गर्टनर

@sagelightning: इस तरह का प्रयास करने के लिए हमें व्यवस्थापक पहुंच की आवश्यकता है।
कुमार एम

@ArtGertner - हत्या (कार्य प्रबंधक के माध्यम से) एक सेवा प्रक्रिया "दुर्घटना" के रूप में व्याख्या की जाएगी और एक वसूली को गति प्रदान करेगी।
मार्टिन बा

3

Cuando se उपयोग Windows en Español, el código debe quedar asi (जब स्पेनिश में विंडोज का उपयोग कर रहा है, कोड है):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "        ESTADO"') do (
  if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here
    REM For example, the following line
    net start MYSERVICE
  )
)

रीमप्लाजर MYSERVICE con el nombre del servicio que se desea procesar। प्यूडेस वर् एल नम्ब्रे डेल सर्विकियो विएंडो लास प्रॉपिडेड्स डेल सर्विकियो। (संसाधित होने वाली सेवा के नाम के साथ MYSERVICE बदलें। आप सेवा के गुणों पर सेवा का नाम देख सकते हैं।)


10
यदि आप अपना उत्तर अंग्रेजी में लिखते हैं तो यह हर एक के लिए बेहतर होगा।
j0k

2
यकीन नहीं होता कि नीच क्यों। यह एक महत्वपूर्ण बिंदु है और यदि संभव हो तो स्ट्रिंग तुलना से बचने का एक कारण है। इस स्थिति में आपको लक्ष्य विंडोज़ इंस्टॉलेशन की डिफ़ॉल्ट भाषा के आधार पर स्ट्रिंग को बदलना होगा।
एलसी।

2
@ एलसी: क्या प्रत्येक भाषा के लिए एक उत्तर शामिल करना उचित होगा? यह संदर्भ के लिए अधिक उपयोगी हो सकता है (या शामिल) एक संसाधन जो कहता है कि दी गई भाषा की खोज करने के लिए कौन सी स्ट्रिंग है।
माइक बेली

2
@echo off

color 1F


@sc query >%COMPUTERNAME%_START.TXT


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul

IF ERRORLEVEL 0 EXIT

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc"

2

नीचे विंडोज सर्वर 2012 के लिए जो मेरे लिए काम किया है। केवल "SERVICENAME" को वास्तविक सेवा नाम से बदलें:

@ECHO OFF
SET SvcName=SERVICENAME

SC QUERYEX "%SvcName%" | FIND "STATE" | FIND /v "RUNNING" > NUL && (
    ECHO %SvcName% is not running 
    ECHO START %SvcName%

    NET START "%SvcName%" > NUL || (
        ECHO "%SvcName%" wont start 
        EXIT /B 1
    )
    ECHO "%SvcName%" is started
    EXIT /B 0
) || (
    ECHO "%SvcName%" is running
    EXIT /B 0
)

1

मैं एक ईमेल भी भेजना चाहता था अगर सेवा इस तरह से शुरू की गई थी, तो @ आईसी कोड में थोड़ा सा जोड़ा गया था, मुझे लगा कि मैं इसे किसी भी तरह से मदद करने के बाद पोस्ट करूंगा। मैंने SendMail का उपयोग किया है लेकिन अन्य कमांड लाइन विकल्प हैं विंडोज बैच फ़ाइल से एक सरल ईमेल कैसे भेजें?

set service=MyServiceName

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (

    net start %service%

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
      if /I "%%H" EQ "RUNNING" (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% succeded.
      ) else (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% failed.
      )
    )

  )
)

1

Powershell स्क्रिप्ट का उपयोग करके सेवा शुरू करना। आप इसे कार्य शेड्यूलर से लिंक कर सकते हैं और अंतराल पर या आवश्यकतानुसार इसे ट्रिगर कर सकते हैं। इसे PS1 फ़ाइल के रूप में बनाएं अर्थात एक्सटेंशन PS1 के साथ फ़ाइल और फिर इस फ़ाइल को कार्य शेड्यूलर से ट्रिगर किया जाए।

सेवा बंद करना शुरू करना

कार्य अनुसूचक में यदि आप सर्वर पर इसका उपयोग कर रहे हैं तो तर्कों में इसका उपयोग करें

-noprofile -executionpolicy bypass -file "C: \ Service पुनः आरंभ लिपियों \ StopService.PS1"

cmd पर समान चलाकर सत्यापित करें यदि यह काम करता है तो कार्य शेड्यूलर पर भी काम करना चाहिए

$Password = "Enter_Your_Password"
$UserAccount = "Enter_Your_AccountInfor"
$MachineName = "Enter_Your_Machine_Name"
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService")
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt"
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh"
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STARTING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Starting Service - " $ServiceList[$i]

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName
Start-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Running")
{
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Started Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`n Service didn't Start. Current State is - "
Write-Host $ServiceState.Status
}
}

#code to stop the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STOPPING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Stopping Service - " $ServiceList[$i]

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName
Stop-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Stopped")
{
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`nService didn't Stop. Current State is - "
Write-Host $ServiceState.Status
}
}

0
@Echo off

Set ServiceName=wampapache64

SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(

echo %ServiceName% not running
echo  

Net start "%ServiceName%"


    SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
        Echo "%ServiceName%" wont start
    )
        echo "%ServiceName%" started

)||(
    echo "%ServiceName%" was working and stopping
    echo  

    Net stop "%ServiceName%"

)


pause

0

@DanielSerrano द्वारा उत्तर के साथ संबंधित, मैं हाल ही sc.exeमें स्पेनिश में अर्थात् कमांड के स्थानीयकरण से थोड़ा सा हुआ हूं । मेरा प्रस्ताव उस लाइन और टोकन को इंगित करना है जो संख्यात्मक सेवा स्थिति रखता है और इसकी व्याख्या करता है, जो कि अधिक मजबूत होनी चाहिए:

@echo off

rem TODO: change to the desired service name
set TARGET_SERVICE=w32time

set SERVICE_STATE=
rem Surgically target third line, as some locales (such as Spanish) translated the utility's output
for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "%TARGET_SERVICE%" 2>nul"') do (
  if not defined SERVICE_STATE set SERVICE_STATE=%%i
)
rem Process result
if not defined SERVICE_STATE (
  echo ERROR: could not obtain service state!
) else (
  rem NOTE: values correspond to "SERVICE_STATUS.dwCurrentState"
  rem https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
  if not %SERVICE_STATE%==4 (
    echo WARNING: service is not running
    rem TODO: perform desired operation
    rem net start "%TARGET_SERVICE%"
  ) else (
    echo INFORMATION: service is running
  )
)

के साथ परीक्षण किया गया:

  • विंडोज एक्सपी (32-बिट) अंग्रेजी
  • विंडोज 10 (32-बिट) स्पेनिश
  • विंडोज 10 (64-बिट) अंग्रेजी

0

शायद बहुत आसान तरीका है? बस यहाँ उत्तर की सूची में जोड़ने:

@for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.