다음을 통해 공유


서비스 트리거 이벤트

트리거 이벤트가 발생할 때 서비스를 등록하여 시작하거나 중지할 수 있습니다. 이렇게 하면 시스템이 시작될 때 서비스가 시작되거나 서비스가 이벤트를 폴링하거나 적극적으로 대기할 필요가 없습니다. 서비스가 필요할 때 작업이 있는지 여부를 자동으로 시작하는 대신 시작할 수 있습니다. 미리 정의된 트리거 이벤트의 예로는 지정된 디바이스 인터페이스 클래스의 디바이스 도착 또는 특정 방화벽 포트의 가용성이 있습니다. 서비스는 ETW( Windows용 이벤트 추적 ) 공급자가 생성한 사용자 지정 트리거 이벤트에 등록할 수도 있습니다.

Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: 서비스 트리거 이벤트는 Windows Server 2008 R2 및 Windows 7까지 지원되지 않습니다.

트리거는 트리거 이벤트 유형, 트리거 이벤트 하위 형식, 트리거 이벤트에 대한 응답으로 수행할 작업 및 (특정 트리거 이벤트 형식의 경우) 하나 이상의 트리거별 데이터 항목으로 구성됩니다. 하위 형식과 트리거별 데이터 항목은 함께 이벤트 서비스에 알리기 위한 조건을 지정합니다. 데이터 항목의 형식은 트리거 이벤트 유형에 따라 달라집니다. 데이터 항목은 이진 데이터, 문자열 또는 다중 문자열일 수 있습니다. 문자열은 유니코드여야 합니다. ANSI 문자열은 지원되지 않습니다.

트리거 이벤트를 등록하기 위해 서비스는 SERVICE_CONFIG_TRIGGER_INFOChangeServiceConfig2를 호출하고 SERVICE_TRIGGER_INFO 구조를 제공합니다. SERVICE_TRIGGER_INFO 구조체는 각각 하나의 트리거를 지정하는 SERVICE_TRIGGER 구조체의 배열을 가리킵니다.

지정된 트리거 작업은 시스템이 시작될 때 트리거 조건이 true이거나 시스템이 실행되는 동안 트리거 조건이 true가 되는 경우 수행됩니다. 예를 들어 특정 디바이스를 사용할 수 있을 때 서비스가 시작되도록 등록하는 경우 디바이스가 컴퓨터에 이미 연결되어 있으면 시스템이 시작될 때 서비스가 시작됩니다. 시스템이 실행되는 동안 사용자가 디바이스에 연결하는 경우 디바이스가 도착하면 서비스가 시작됩니다.

트리거에 트리거별 데이터 항목이 있는 경우 트리거 이벤트와 함께 제공되는 데이터 항목이 서비스가 트리거와 함께 지정한 데이터 항목 중 하나와 일치하는 경우에만 트리거 작업이 수행됩니다. 이진 데이터 일치는 비트 비교를 통해 수행됩니다. 문자열 일치는 대/소문자를 구분하지 않습니다. 데이터 항목이 다중 문자열인 경우 다중 문자열의 모든 문자열이 일치해야 합니다.

트리거 이벤트에 대한 응답으로 서비스가 시작되면 서비스는 ServiceMain 콜백 함수에서 argv[1]로 SERVICE_TRIGGER_STARTED_ARGUMENT 받습니다. Argv[0]은 항상 서비스의 짧은 이름입니다.

트리거 이벤트에 대한 응답으로 시작되도록 등록하는 서비스는 서비스가 수행할 작업이 없을 때 유휴 시간 초과 후 자체적으로 중지될 수 있습니다. 자체를 중지하는 서비스는 서비스가 자체 중지되는 동안 도착하는 SERVICE_CONTROL_TRIGGEREVENT 제어 요청을 처리할 수 있도록 준비해야 합니다. SCM은 서비스가 실행 중 상태인 동안 새 트리거 이벤트가 발생할 때마다 SERVICE_CONTROL_TRIGGEREVENT 제어 요청을 보냅니다. 트리거 이벤트가 손실되지 않도록 하려면 서비스가 실행 중에서 중지로 전환되는 동안 도착하는 모든 SERVICE_CONTROL_TRIGGEREVENT 제어 요청에 대한 ERROR_SHUTDOWN_IN_PROGRESS 반환해야 합니다. 이렇게 하면 SCM에서 트리거 이벤트를 큐에 대기하고 서비스가 중지됨 상태가 될 때까지 기다리도록 지시합니다. 그런 다음 SCM은 서비스 시작과 같이 큐에 대기 중인 트리거 이벤트와 관련된 작업을 수행합니다.

서비스에서 트리거 이벤트를 다시 처리할 준비가 되면 SetServiceStatus 호출에서 컨트롤 허용 마스크의 SERVICE_ACCEPT_TRIGGEREVENT 설정합니다. 이 작업은 일반적으로 서비스에서 SERVICE_RUNNING사용하여 SetServiceStatus를 호출할 때 수행됩니다. 그런 다음 SCM은 큐가 비어 있는 각 큐 트리거 이벤트에 대한 SERVICE_CONTROL_TRIGGEREVENT 요청을 실행합니다.

트리거 이벤트에 대한 응답으로 종속 서비스가 실행되는 서비스를 중지할 수 없습니다.

트리거 시작 및 트리거 중지 요청은 낮은 메모리 조건에서 보장되지 않습니다.

QueryServiceConfig2 함수를 사용하여 서비스의 트리거 이벤트 구성을 검색합니다.

SC 도구(sc.exe)를 사용하여 명령 프롬프트에서 서비스의 트리거 이벤트를 구성하거나 쿼리할 수 있습니다. triggerinfo 옵션을 사용하여 트리거 이벤트에 대한 응답으로 시작하거나 중지하도록 서비스를 구성합니다. qtriggerinfo 옵션을 사용하여 서비스의 트리거 구성을 쿼리합니다.

다음 예제에서는 W32time 서비스의 트리거 구성을 쿼리합니다. 이 구성은 컴퓨터가 도메인에 조인될 때 시작하고 컴퓨터가 도메인을 떠날 때 중지되도록 구성됩니다.

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

다음 예제에서는 GUID 가 {4d1e55b2-f16f-11cf-88cb-0011111000030}인 HID 디바이스와 지정된 HID 디바이스 ID가 도착할 때 시작되도록 구성된 태블릿 입력 서비스의 트리거 구성을 쿼리합니다.

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004