배치 또는 cmd 파일을 통해 서비스를 중지하고 시작 하시겠습니까?


288

박쥐 또는 cmd를 스크립팅하여 오류 검사를 통해 안정적으로 서비스를 중지하고 시작하려면 어떻게해야합니까 (또는 어떤 이유로 든 성공하지 못했음을 알려주세요)?


아마도 batoff와 cmd 명령을 요구하기 때문에 다소 주제가 맞지 않지만 PowerShell 은 이와 같은 작업을 수행하기위한 많은 제어 및 피드백을 제공합니다.
GvS

답변:


347

사용 SC(서비스 제어) 명령을, 그것은 당신에게 단지보다 훨씬 더 많은 옵션을 제공 start&를 stop.

  기술:
          SC는 다음과 통신하는 데 사용되는 명령 줄 프로그램입니다.
          NT 서비스 컨트롤러 및 서비스.
  용법:
      sc <서버> [명령] [서비스 이름] ...

      <서버> 옵션의 형식은 "\\ ServerName"입니다.
      "sc [command]"를 입력하면 명령에 대한 추가 도움말을 얻을 수 있습니다.
      명령 :
        query ----------- 서비스 상태를 쿼리하거나
                        서비스 유형의 상태를 열거합니다.
        queryex --------- 서비스의 확장 상태를 쿼리하거나
                        서비스 유형의 상태를 열거합니다.
        start ----------- 서비스를 시작합니다.
        pause ----------- 서비스에 PAUSE 제어 요청을 보냅니다.
        interrogate ----- INTERROGATE 제어 요청을 서비스에 보냅니다.
        continue -------- CONTINUE 제어 요청을 서비스에 보냅니다.
        stop ------------ 서비스에 STOP 요청을 보냅니다.
        config ---------- 서비스의 구성을 변경합니다 (지속적).
        description ----- 서비스 설명을 변경합니다.
        failure --------- 서비스가 실패했을 때 취한 조치를 변경합니다.
        qc -------------- 서비스의 구성 정보를 쿼리합니다.
        qdescription ---- 서비스에 대한 설명을 쿼리합니다.
        qfailure -------- 서비스가 실패했을 때 취한 조치를 쿼리합니다.
        delete ---------- 레지스트리에서 서비스를 삭제합니다.
        create ---------- 서비스를 만듭니다. (레지스트리에 추가)
        control --------- 서비스에 제어를 보냅니다.
        sdshow ---------- 서비스의 보안 설명자를 표시합니다.
        sdset ----------- 서비스의 보안 설명자를 설정합니다.
        GetDisplayName-- 서비스의 DisplayName을 가져옵니다.
        GetKeyName ------ 서비스의 ServiceKeyName을 가져옵니다.
        EnumDepend ------ 서비스 종속성을 열거합니다.

      다음 명령에는 서비스 이름이 필요하지 않습니다.
      sc <서버> <명령> <옵션>
        boot ------------ (ok | bad) 마지막 부팅 여부를 나타냅니다
                        마지막으로 성공한 부팅 구성으로 저장
        잠금 ------------ 서비스 데이터베이스를 잠급니다
        QueryLock ------- SCManager 데이터베이스의 잠금 상태를 쿼리합니다.
  예:
          sc 시작 MyService

1
이것이 순 시작 / 정지보다 낫다는 데 동의합니다. 원격 컴퓨터에서도 서비스를 터치 할 수있는 옵션이 있습니다.
무법자 프로그래머

1
좋은 대답입니다. 그러나 'SC start service'를 실행하려면 관리자 여야합니다. 그에 대한 해결책을 찾을 여기을 (허용 대답이 솔루션을 포함).
마이클 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은 성공을 나타냅니다. 더 높은 것은 실패를 나타냅니다.

박쥐 파일로서 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

2015 년 4 월 4 일 수정

리턴 코드 :

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

(Edit가 말했듯이) 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나에게 가장 좋은 방법처럼 보인다. Net Start return codes를 살펴보십시오 .


2
연결된 페이지가 더 이상 존재하지 않습니다. 따라서 이것은 현재 더 많은 의견입니다.
Neolisk

5

문법은 항상 나를 얻는다.

다음은 두 시스템의 관리자 인 경우 .bat를 관리자로 실행하고 시스템이 동일한 도메인에있는 경우 배치 파일에 행을 추가하여 다른 시스템에서 원격 서비스를 종료하는 방법입니다. 컴퓨터 이름은 UNC 형식 \ myserver를 따릅니다.

sc \\ip.ip.ip.ip stop p4_1

이 경우 ... Service Manager에서 서비스 속성을 볼 때 p4_1은 서비스 이름과 표시 이름입니다. 서비스 이름을 사용해야합니다.

서비스 운영 마약 중독자의 경우 이유 코드와 의견을 추가하십시오! 즉, '계획'과 동일한 '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"이 서비스를 중지시킬 것이라고 생각하고 싶습니다. 슬프게도 현실은 그다지 흑백이 아닙니다. 서비스를 중지하는 데 시간이 오래 걸리면 서비스가 중지되기 전에 명령이 반환됩니다. 그러나 오류 수준을 확인하지 않으면 알 수 없습니다.

해결책은 서비스가 중지 될 때까지 루프 상태를 돌릴 때마다 일시 중지되어 서비스 상태를 찾는 것입니다.

그러나 다시 ...

첫 번째 서비스를 중지하는 데 오랜 시간이 걸리고 후속 서비스의 "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

시간 초과를 삽입하는 것이 좋습니다. 핑 (1 초마다 핑)을 사용합니다. sc 중지 ping localhost -n 60 sc start


2

batch를 사용하여 시스템 복원을 시작하는 Windows 10 명령은 다음과 같습니다.

sc config swprv start= Auto

이러한 명령을 좋아할 수도 있습니다.

  • 시스템 복원을 자동으로 시작하도록 레지스트리 값 변경

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore"/ v DisableSR / t REG_DWORD / d 0 / f

  • 시스템 복원 지점 생성

    Wmic.exe / Namespace : \ root \ default 경로 SystemRestore 호출 CreateRestorePoint "djibe 저장 한 PC", 100, 12

  • 시스템 복원 디스크 사용량 변경

    vssadmin 섀도 저장소 크기 조정 / for = C : / on = C : / maxsize = 10 %

즐겨


1

SC 시작, 중지, 확인, 구성 등의 서비스로 모든 작업을 수행 할 수 있습니다 ...


1

때때로 당신은 정지가 작동하지 않는 것을 찾을 수 있습니다 ..

내 SQlServer가 때때로 이것을 수행합니다. 다음 명령 줄을 사용하면 명령 줄이 종료됩니다. 멈추지 않는 것을 죽이는 스크립트가 정말로 필요한 경우. 나는 이것을 최후의 수단으로 할 것입니다.

taskkill /pid [pid number] /f

0

C #에서 Windows 서비스를 작성 중입니다. 중지 / 제거 / 빌드 / 설치 / 시작 루프가 너무 지쳤습니다. 미니 스크립트를 작성했습니다.reploy.bat 하여 루프를 자동화하기 위해 Visual Studio 출력 디렉토리 (내장 된 서비스 실행 파일이있는 디렉토리)에 드롭했습니다.

이 3 가지 변수를 설정하십시오.

servicename : Windows 서비스 제어판 (services.msc)에 표시됩니다.

slndir : 솔루션 (.sln) 파일이 포함 된 폴더 (전체 경로 아님)

binpath : 빌드에서 서비스 실행 파일의 전체 경로 (폴더 경로가 아님)

참고 : msbuild명령이 작동 하려면 Visual Studio Developer 명령 줄에서 실행해야합니다.

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.