Go by Example: 프로세스 실행

직전의 예제에서 우리는 외부 프로세스를 생성하는 법을 봤습니다. 우리는 실행되고 있는 Go 프로세스에서 외부 프로세스에 접근해야 할 때 프로세스를 생성합니다. 가끔, 우리는 그냥 프로세스 전체를 다른 프로세스로 대체하고싶을 때가 있습니다. 이를 위해서, 우리는 Go의 exec라는 고전적인 함수의 구현체를 이용할 것입니다.

package main
import "syscall"
import "os"
import "os/exec"
func main() {

우리의 예제에서는 ls를 exec할 것입니다. Go는 우리가 실행시킬 binary의 절대경로를 요구합니다. 따라서, 우리는 exec.LookPath라는 함수를 이용하여 절대경로를 찾아볼 것입니다. (아마도 /bin/ls 일 것입니다.)

	binary, lookErr := exec.LookPath("ls")
	if lookErr != nil {
		panic(lookErr)
	}

Exec는 커맨드만 담긴 커다란 문자열 하나가 아닌 slice 형태로 된 인자를 요구합니다. ls에 흔히 넘기는 인자 몇개를 넘겨볼 것입니다. 첫 번째 인자가 프로그램의 이름이어야 한다는 것을 명심하세요.

	args := []string{"ls", "-a", "-l", "-h"}

Exec환경변수도 필요로 합니다. 여기서는 우리의 작업환경을 넘겨봅시다.

	env := os.Environ()

여기서 syscall.Exec가 실제로 호출됩니다. 만약 호출에 성공했다면 우리의 프로세스 실행은 여기서 끝나고 /bin/ls -a -l -h로 대체될 것입니다. 만약 에러가 있다면 여기서 반환된 값을 얻을 것입니다.

	execErr := syscall.Exec(binary, args, env)
	if execErr != nil {
		panic(execErr)
	}
}

프로그램을 실행시키면 프로그램은 ls로 대체됩니다.

$ go run execing-processes.go
total 16
drwxr-xr-x  4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go

Go가 고전 Unix의 fork를 제공하지 않는다는 사실을 기억하십시오. 보통 고루틴을 이용하여 프로세스를 생성하거나 exec하여 fork의 대부분의 use case를 다루기 때문에 웬만해선 문제가 되지 않을 것입니다.

다음 예제: 시그널.