어떻게 go 프로그램 에서 종료 신 호 를 캡 처 합 니까?

2694 단어
Liux 환경 에서 프로그램 자체 의 실행 종료 와 종료 외 에 도 많은 다른 종료 방식 이 있 습 니 다. 예 를 들 어 우 리 는 셸 에서 명령 kill 이나 kill - 9 를 직접 실행 합 니 다. 단지 하나의 - 9 인자 만 더 있 으 면 서로 다른 종료 방식 에 속 합 니 다. 왜냐하면 그들 은 프로그램 에 서로 다른 신 호 량 을 보 낼 것 이기 때 문 입 니 다.
kill 을 실행 할 때 기본적으로 SIGTERM 신 호 를 프로그램 에 보 냅 니 다. 프로그램 이 이 신 호 를 받 았 을 때 다음 과 같은 집중 방식 이 나타 날 수 있 습 니 다.
  • 프로그램 종료
  • 청소 작업 을 수행 한 후 종료
  • 무시 하고 계속 집행
  • 이 세 가지 방식 은 모두 프로그램 에서 코드 를 통 해 직접 실현 할 수 있 는 것 이다. 비교적 좋 은 실행 방식 은 두 번 째 자원 을 정리 한 후에 종료 하 는 것 이다. 어떤 프로그램 은 우리 가 생각 하 는 것 처럼 종료 작업 을 수행 하지 않 기 때문에 관리 자 는 이런 상황 을 발견 하면 더욱 직접적인 방식 으로 - 9 매개 변수의 신 호 를 프로그램 에 보낸다.즉, SIGKILL 신호 입 니 다. 이 신 호 는 무시 할 수 없습니다. 그 는 전체 시스템 의 init 프로그램 이 이 프로 세 스 의 운행 을 중단 하고 프로 세 스 가 직접 종료 되 며 이 행 위 를 의식 할 기회 가 없습니다.
    다른 하 나 는 우리 가 프론트 데스크 톱 에서 실행 하 는 프로그램의 종료 입 니 다. 우 리 는 보통 ctrl - c 를 실행 하여 프로그램의 실행 을 종료 합 니 다. 이 조합 키 는 프로그램 에 SIGINT 명령 을 보 냅 니 다. 이 명령 도 프로그램 에서 캡 처 할 수 있 기 때문에 우 리 는 어떤 신호 명령 을 캡 처 하여 미리 정 의 된 종료 절 차 를 진행 해 야 하 는 지 알 게 되 었 습 니 다.
    다음 에 우리 가 사용 하 는 코드 는 signal. Notify 함 수 를 이용 하여 두 가지 신 호 를 파이프 에 연결 하 는 것 입 니 다. 이 신 호 를 받 으 면 channel 에 전달 합 니 다. 또한 우 리 는 전문 적 인 goroutine 으로 이 channel 의 데 이 터 를 소비 합 니 다. 기본 적 인 상황 에서 첫 번 째 문 구 를 막 고 신호 가 전달 되면 청 소 를 하고 시스템 을 종료 합 니 다. 코드 는 다음 과 같 습 니 다.
    package main
    
    import (
        "log"
        "os"
        "os/signal"
        "sync"
        "syscall"
        "time"
    )
    
    func main() {
        var stopLock sync.Mutex
        stop := false
        stopChan := make(chan struct{}, 1)
        signalChan := make(chan os.Signal, 1)
        go func() {
            //      ,         
            true
            stopLock.Unlock()
            log.Println("Cleaning before stop...")
            stopChan struct{}{}
            os.Exit(0)
        }()
        signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
        //           
        time.Sleep(10 * time.Second)
    }
    

    좋은 웹페이지 즐겨찾기