서비스가 배치 파일을 통해 실행 중인지 확인하고 실행 중이 아닌 경우 시작하는 방법은 무엇입니까?
다음 작업을 수행하는 배치 파일을 작성하고 싶습니다.
- 서비스가 실행 중인지 확인
- 실행 중이면 배치를 종료하십시오.
- 실행 중이 아니면 서비스를 시작하십시오.
지금까지 검색 한 코드 샘플이 작동하지 않는 것으로 밝혀져 게시하지 않기로 결정했습니다.
서비스 시작은 다음을 통해 수행됩니다.
net start "SERVICENAME"
- 서비스가 실행 중인지 확인하고 배치 파일에서 if 문을 만드는 방법은 무엇입니까?
- 조금 혼란 스러워요. 넷 스타트에 전달해야하는 주장은 무엇입니까? 서비스 이름 또는 표시 이름?
서비스 상태를 확인하려면을 사용하십시오 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"
)
)
그것이하는 일에 대한 설명 :
- 서비스의 속성을 쿼리합니다.
- "STATE"텍스트가 포함 된 줄을 찾습니다.
- 해당 라인을 토큰 화하고 서비스 상태를 포함하는 세 번째 토큰을 꺼냅니다.
- 문자열 "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"
'programing' 카테고리의 다른 글
JDBC에서 DATETIME 값 0000-00-00 00:00:00 처리 (0) | 2020.09.20 |
---|---|
HttpServletRequest에서 POST 요청 본문 가져 오기 (0) | 2020.09.20 |
공용 REST API를 테스트하기 위해 어떤 도구를 사용합니까? (0) | 2020.09.19 |
timedelta 이해 (0) | 2020.09.19 |
여전히 인라인 용도가 있습니까? (0) | 2020.09.19 |