Go by Example: Exec'ing Processes

En el ejemplo anterior vimos cómo generar procesos externos. Hacemos esto cuando necesitamos que un proceso externo esté accesible para un proceso de Go en ejecución. A veces simplemente queremos reemplazar completamente el proceso actual de Go con otro (quizás no de Go). Para hacer esto, utilizaremos la implementación en Go de la clásica función exec.

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

Para nuestro ejemplo, ejecutaremos ls. Go requiere una ruta absoluta al binario que queremos ejecutar, así que usaremos exec.LookPath para encontrarlo (probablemente /bin/ls).

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

Exec requiere argumentos en forma de arreglo (en contraposición a una gran cadena). Le daremos a ls algunos argumentos comunes. Ten en cuenta que el primer argumento debe ser el nombre del programa.

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

Exec también necesita un conjunto de variables de entorno para usar. Aquí simplemente proporcionamos nuestro entorno actual.

    env := os.Environ()

Aquí está la llamada real a syscall.Exec. Si esta llamada es exitosa, la ejecución de nuestro proceso terminará aquí y será reemplazada por el proceso /bin/ls -a -l -h. Si hay un error, obtendremos un valor de retorno.

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

Cuando ejecutamos nuestro programa, este es reemplazado por 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

Nota que Go no ofrece una función clásica de Unix fork. Usualmente esto no es un problema, ya que iniciar goroutines, generar procesos y ejecutar procesos cubre la mayoría de los casos de uso para fork.

Siguiente ejemplo: Signals.