[go] go 언어의 exec 패키지를 사용하여 시그널 처리하는 방법

Go 언어에서 외부 명령을 실행하고 이 명령에 시그널을 보내는 방법을 알아보겠습니다. 시그널은 프로세스에 특정 이벤트가 발생했음을 알리는 운영 체제 수준의 메시지입니다. 이를 통해 외부 프로세스에게 종료 신호를 보내거나 다른 동작을 수행할 수 있습니다.

exec 패키지

Go 언어의 os/exec 패키지는 외부 명령을 실행하고 입출력을 조작하는 기능을 제공합니다. 또한 시그널을 보내거나 받는 기능도 포함되어 있습니다.

package main

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

func main() {
	cmd := exec.Command("myCommand")
	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}  // 프로세스 그룹 ID 설정
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	go func() {
		sig := <-signal.SIGTERM  // SIGTERM 시그널 수신
		fmt.Println("Received SIGTERM signal")
		_ = syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM)  // 명령에 SIGTERM 시그널 전송
	}()

	err := cmd.Run()
	if err != nil {
		fmt.Println("Error executing command:", err)
	}
}

위의 예제는 os/exec 패키지를 사용하여 명령을 실행하고, 시그널을 받아서 외부 명령에 전달하는 방법을 보여줍니다. syscall 패키지를 사용하여 시그널을 전달하는 부분을 볼 수 있습니다.

결론

Go 언어의 os/exec 패키지를 사용하여 외부 명령을 실행하고 시그널을 처리하는 방법에 대해 알아보았습니다. 이를 통해 안전하고 효율적인 외부 명령 실행 및 시그널 처리를 구현할 수 있습니다.

더 많은 정보는 공식 Go 언어 문서를 참고하시기 바랍니다.