Go за Прикладом: Заміна поточного процесу новим

Work in Progress / Сайт в процесі розробки

У попередньому прикладі ми розглянули запуск сторонніх процесів. Ми робимо це коли хочемо, щоб запущений процес був доступний нашому Go процесу. Але інколи, все чого ми бажаєм - це лише повністю замінити поточний Goпроцес іншим (можливо навіть не “Go-процесом”). Ми скористаємось реалізацією Go класичного системного виклику exec.

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

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

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

Exec потребує аргументу у вигляді зрізу (напротивагу одному великому рядку). Ми надамо ls кілька звичайних (для цієї команди) аргументів.

    args := []string{"-h", "-o"}

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 24
-rw-r--r-- oleg 2.1K Jun 18 22:12 execing-processes.go
-rw-r--r-- oleg  53B Jun 18 22:08 execing-processes.hash
-rw-r--r-- oleg 266B Jun 18 22:11 execing-processes.sh

Наступний приклад: Сигнали.