Go в примерах: Исполняющие процессы (Exec'ing Processes)

В предыдущем примере мы рассмотрели порождение внешних процессов. Мы делаем это, когда нам нужен внешний процесс, доступный для запущенного процесса Go. Иногда мы просто хотим полностью заменить текущий процесс Go другим (возможно, не Go). Для этого мы будем использовать реализацию Go-имплементацию классической функции exec.

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

Для нашего примера мы выполним ls. Go требует абсолютного пути к двоичному файлу, который мы хотим выполнить, поэтому мы используем exec.LookPath, чтобы найти его (вероятно, /bin/ls).

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

Exec требует аргументы в форме среза (в сочетании с одной большой строкой). Мы используем в 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)
    }
}

When we run our program it is replaced by 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 функцию форка. Обычно это не проблема, так как запуск горутин, порождение процессов и выполнение процессов покрывают большинство случаев использования форка.

Следующий пример: Сигналы (Signals).