programing

서비스가 배치 파일을 통해 실행 중인지 확인하고 실행 중이 아닌 경우 시작하는 방법은 무엇입니까?

nasanasas 2020. 9. 20. 10:01
반응형

서비스가 배치 파일을 통해 실행 중인지 확인하고 실행 중이 아닌 경우 시작하는 방법은 무엇입니까?


다음 작업을 수행하는 배치 파일을 작성하고 싶습니다.

  • 서비스가 실행 중인지 확인
    • 실행 중이면 배치를 종료하십시오.
    • 실행 중이 아니면 서비스를 시작하십시오.

지금까지 검색 한 코드 샘플이 작동하지 않는 것으로 밝혀져 게시하지 않기로 결정했습니다.

서비스 시작은 다음을 통해 수행됩니다.

net start "SERVICENAME"
  1. 서비스가 실행 중인지 확인하고 배치 파일에서 if 문을 만드는 방법은 무엇입니까?
  2. 조금 혼란 스러워요. 넷 스타트에 전달해야하는 주장은 무엇입니까? 서비스 이름 또는 표시 이름?

서비스 상태를 확인하려면을 사용하십시오 sc query <SERVICE_NAME>. 배치 파일의 if 블록에 대해서는 문서를 확인하십시오 .

다음 코드는 서비스의 상태를 확인하고 MyServiceName실행 중이 아니면 시작합니다 (서비스가 실행 중이 아니면 if 블록이 실행 됨).

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. 해당 라인을 토큰 화하고 서비스 상태를 포함하는 세 번째 토큰을 꺼냅니다.
  4. 문자열 "RUNNING"에 대해 결과 상태를 테스트합니다.

두 번째 질문에 관해서는, 당신이 전달하려는 것 인수는 net start서비스 이름입니다 하지 표시 이름.


서비스를 전환하려면 다음을 사용하십시오.

NET START "분산 트랜잭션 코디네이터"|| NET STOP "분산 트랜잭션 코디네이터"


다음 명령을 사용하여 서비스가 실행 중인지 여부를 확인할 수 있습니다.

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

NOD32 Antivirus를 실행하면 다음과 같은 결과가 나타납니다.

STATE                       : 4 RUNNING

중지 된 경우 다음과 같이 표시됩니다.

STATE                       : 1 STOPPED

이를 변수에 사용하여 NET START를 사용할지 여부를 결정할 수 있습니다.

서비스 이름은 표시 이름이 아닌 서비스 이름이어야합니다.


그렇게해야합니다.

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)

언어 독립적 버전.

@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
)

방금이 스레드를 찾았고 사용자가 배치 파일을 사용하여 서비스를 다시 시작하지 않으려는 경우 토론에 추가하고 싶었습니다. Windows에는 서비스, 서비스 속성, 복구로 이동하는 옵션이 있습니다. 여기에서 서비스에 대한 매개 변수를 설정할 수 있습니다. 서비스가 중지되면 서비스를 다시 시작합니다. 또한 컴퓨터를 다시 시작할 때와 다른 작업을 두 번째 실패로 시도 할 수도 있습니다.


Cuando se는 Windows en Español, el código debe quedar asi를 사용합니다 (스페인어로 Windows를 사용하는 경우 코드는 다음과 같습니다).

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

Reemplazar MYSERVICE con el nombre del servicio que se desea procesar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (MYSERVICE를 처리 할 서비스 이름으로 바꾸십시오. 서비스 속성에서 서비스 이름을 볼 수 있습니다.)


@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"

나는 또한 서비스가 이런 식으로 시작되면 이메일을 보내고 싶었으므로 @Ic 코드에 약간 추가하여 누군가에게 도움이 될 경우 게시 할 것이라고 생각했습니다. SendMail을 사용했지만 다른 명령 줄 옵션이 있습니다 . Windows 배치 파일에서 간단한 이메일을 보내는 방법은 무엇입니까?

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

  )
)

Powershell 스크립트를 사용하여 서비스를 시작합니다. 이를 작업 스케줄러에 연결하고 간격 또는 필요에 따라 트리거 할 수 있습니다. 이것을 PS1 파일, 즉 확장자가 PS1 인 파일로 생성 한 다음이 파일이 작업 스케줄러에서 트리거되도록합니다.

서비스 중지를 시작하려면

작업 스케줄러에서 서버에서 사용하는 경우 인수에 이것을 사용하십시오.

-noprofile -executionpolicy 우회 -file "C : \ Service Restart Scripts \ 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
}
}

아래 Windows Server 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
)

@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

@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
  )
)

테스트 대상 :

  • Windows XP (32 비트) 영어
  • Windows 10 (32 비트) 스페인어
  • Windows 10 (64 비트) 영어

훨씬 더 간단한 방법일까요? 여기에 답변 목록에 추가하기 만하면됩니다.

@for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"

참고URL : https://stackoverflow.com/questions/3325081/how-to-check-if-a-service-is-running-via-batch-file-and-start-it-if-it-is-not-r

반응형