[go] go 언어의 exec 패키지를 사용하여 파이프 인터럽트 처리하는 방법

Go 언어의 exec 패키지를 사용하여 외부 명령 실행 시, 파이프를 사용하여 입력을 전달하고 인터럽트를 처리하는 방법에 대해 알아보겠습니다.

exec 패키지 소개

exec 패키지는 외부 명령을 실행하고 다른 프로그램과의 입/출력 스트림을 처리하는 기능을 제공합니다. 이를 통해 Go 프로그램에서 외부 명령을 실행하고 그 결과를 가져와서 원하는 대로 처리할 수 있습니다.

파이프를 이용한 명령 실행

외부 명령을 실행할 때 파이프를 사용하여 입력을 전달하는 경우, exec 패키지를 사용하여 명령을 실행하고 입력을 파이프를 통해 전달할 수 있습니다.

다음은 파이프를 이용하여 입력을 전달하는 예시입니다.

package main

import (
	"os/exec"
	"io"
)

func main() {
	cmd := exec.Command("echo", "Hello, Go Exec!")
	stdin, _ := cmd.StdinPipe()
	io.WriteString(stdin, "input data")
	stdin.Close()
	out, _ := cmd.CombinedOutput()
    println(string(out))
}

파이프를 이용한 인터럽트 처리

파이프를 사용하여 명령의 입력을 전달할 때, 명령이 실행되는 동안에 인터럽트 시그널을 캐치하고자 할 수 있습니다. 이를 위해 os/signal 패키지를 사용하여 인터럽트 시그널을 처리할 수 있습니다.

다음은 파이프를 이용하여 입력을 전달하는 동안에 인터럽트 시그널을 처리하는 예시입니다.

package main

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

func main() {
    // Handle interrupt signal
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
    go func(){
        <- c
        println("Interrupted")
        // Perform cleanup and exit
    }()

	cmd := exec.Command("echo", "Hello, Go Exec!")
	stdin, _ := cmd.StdinPipe()
	io.WriteString(stdin, "input data")
	stdin.Close()
	out, _ := cmd.CombinedOutput()
    println(string(out))
}

위 코드에서는 os/signal 패키지를 사용하여 Interrupt 시그널을 캐치하여 “Interrupted” 메시지를 출력하고 프로그램을 정상적으로 종료하는 예시입니다.

이를 통해 Go의 exec 패키지를 사용하여 파이프를 이용한 입력 전달과 인터럽트 처리하는 방법에 대해 살펴보았습니다.