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
패키지를 통해 운영 체제의 시그널을 처리하고 관리할 수 있는 다양한 기능을 제공합니다. 프로그램이 안정적으로 운영되고 종료될 수 있도록 적절한 시그널 처리 및 관리를 함께 고려해야 합니다.
참고 문헌:
- Go 언어 공식 문서 - os/signal
- Donovan, A. A., & Kernighan, B. W. (2015). The Go programming language. Addison-Wesley.