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

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

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

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

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

Exec требует аргументы в форме среза (вместо одной длинной строки). Мы отправим как входные параметры несколько простых аргументов. Стоит заметить, что первый аргумент должен быть название команды (программы).

    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), создающий новый процесс (потомок). Обычно это не является проблемой, и выполнение процессов покрывает практически все случаи для fork.

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