[go] go 언어에서의 os 신호 처리 및 시그널 관리

Go 언어에서는 운영 체제(OS)의 신호를 처리하고 시그널을 관리하는 기능을 제공합니다. 이 기능을 사용하여 프로그램이 운영 체제에서 발생하는 시그널(예: SIGINT, SIGKILL 등)을 잡고 이를 효과적으로 처리할 수 있습니다. 이 글에서는 Go 언어에서의 시그널 처리 및 관리 방법에 대해 살펴보겠습니다.

시그널 처리 함수 정의

Go 언어에서는 os/signal 패키지를 통해 시그널 처리를 위한 기능을 제공합니다. 시그널을 받고 처리하기 위해서는 다음과 같이 시그널을 처리할 함수를 정의해야 합니다.

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

func signalHandler() {
	sigCh := make(chan os.Signal, 1)
	signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)

	for {
		sig := <-sigCh
		fmt.Println("Received signal:", sig)
		// 시그널 처리 로직 작성
	}
}

func main() {
	go signalHandler()

	// 작업 수행
	// ...
}

위의 예제 코드에서 signalHandler 함수는 운영 체제에서 수신한 시그널을 처리하는 함수입니다. signal.Notify 함수를 사용하여 특정 시그널(SIGINT, SIGTERM)을 수신할 때 마다 채널에 전송하도록 설정합니다. 그리고 이를 무한 루프를 통해 계속해서 대기하고 있는 상태입니다.

시그널 처리 및 종료 시그널 처리

시그널을 받고 처리할 때는 해당 시그널에 따라 적절한 동작을 수행해야 합니다. 예를 들어, SIGINT를 받았을 때는 프로그램을 graceful 하게 종료하고 리소스를 정리하는 등의 작업을 수행할 수 있습니다.

func signalHandler() {
	sigCh := make(chan os.Signal, 1)
	signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)

	for {
		sig := <-sigCh
		switch sig {
		case syscall.SIGINT:
			fmt.Println("Received SIGINT. Graceful shutdown...")
			// 프로그램 종료 및 리소스 정리 로직 작성
			os.Exit(0)
		case syscall.SIGTERM:
			fmt.Println("Received SIGTERM. Exiting immediately...")
			// 프로그램 즉시 종료 로직 작성
			os.Exit(1)
		}
	}
}

위의 예제 코드에서는 SIGINT 시그널을 받았을 때 graceful한 종료를 시도하고 SIGTERM을 받았을 때는 즉시 종료하는 방법으로 처리하는 예시를 보여주고 있습니다.

종합

이렇게 Go 언어에서는 os/signal 패키지를 통해 운영 체제의 시그널을 처리하고 관리할 수 있는 다양한 기능을 제공합니다. 프로그램이 안정적으로 운영되고 종료될 수 있도록 적절한 시그널 처리 및 관리를 함께 고려해야 합니다.

참고 문헌: