[go] 시그널 처리의 사용 사례

시그널(signal)은 UNIX 및 UNIX 계열 운영 체제에서 발생하는 이벤트나 알림을 의미합니다. 이벤트가 발생하면 해당 시그널을 처리하는 것이 중요한데, 다양한 상황에서 시그널을 처리하는 사용 사례를 알아보겠습니다.

1. 프로세스 제어

프로세스 간 통신에서 시그널은 중요한 수단으로 활용됩니다. 예를 들어, 부모 프로세스가 자식 프로세스를 종료하거나, 자식 프로세스가 일시 중단되는 등의 상황에서 시그널을 이용하여 프로세스를 제어할 수 있습니다.

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

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

	// 시그널을 기다리고 있는 동안 작업 수행
	log.Println("대기 중")
	<-sigc
	log.Println("시그널 수신, 종료")
}

위의 예제는 Go 언어를 사용하여 시그널을 처리하는 방법을 보여줍니다.

2. 데몬 프로세스 제어

데몬 프로세스는 시스템이 부팅될 때 시작되고, 종료될 때까지 실행되는 백그라운드 프로세스입니다. 데몬 프로세스는 시그널을 통해 외부로부터 제어를 받을 수 있습니다. 예를 들어, 재시작이나 재구동 명령 등을 시그널을 통해 처리할 수 있습니다.

import (
	"os"
	"os/signal"
	"log"
)

func main() {
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, os.Interrupt)

	// 시그널을 기다리고 있는 동안 작업 수행
	log.Println("대기 중")
	<-sigs
	log.Println("시그널 수신, 종료")
}

위의 예제는 데몬 프로세스에서 시그널을 처리하는 방법을 보여줍니다.

3. 시스템 리부팅 및 종료

시스템이 리부팅되거나 종료될 때 시그널을 이용하여 프로세스에 사전 알림을 할 수 있습니다. 이를 통해 프로세스가 정리 작업을 수행하거나 데이터를 안전하게 저장할 수 있습니다.

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

func main() {
	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)

	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		sig := <-sigs
		log.Println(sig)
		done <- true
	}()

	log.Println("대기 중")
	<-done
	log.Println("시그널 수신, 종료")
}

위의 예제는 시스템 리부팅 및 종료 시 시그널을 처리하는 방법을 보여줍니다.

시그널은 프로세스 관리 및 시스템 관리에 있어서 매우 중요한 역할을 합니다. 다양한 상황에서 시그널을 효과적으로 처리하는 것은 안정적인 운영을 위해 필수적입니다.

참고 자료


이상으로 Go언어를 사용하여 시그널 처리의 사용 사례에 대해 살펴보았습니다.