Execing Processes

Exec’ing Processes->프로세스 실행 #

// 직전의 예제에서 우리는 [외부 프로세스를 생성하는 법](/gobyexample/spawning-processes)
// 을 봤습니다. 우리는 실행되고 있는 Go 프로세스에서 외부 프로세스에
//  접근해야 할 때 프로세스를 생성합니다.
//  가끔, 우리는 그냥 프로세스 전체를 다른 프로세스로
//  대체하고싶을 때가 있습니다.
//  이를 위해서, 우리는 Go의 <a href="http://en.wikipedia.org/wiki/Exec_(operating_system)"><code>exec</code></a>
// 라는 고전적인 함수의 구현체를 이용할 것입니다.

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` 는 [환경변수](/gobyexample/environment-variables)도 필요로 합니다.
	//  여기서는 우리의 작업환경을 넘겨봅시다.
	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를 다루기 때문에
#  웬만해선 문제가 되지 않을 것입니다.