Go by Example: Esecuzione Processi

Nell’esempio precedente abbiamo visto come creare processi esterni. Lo facciamo quando abbiamo bisogno di un processo esterno accessibile a un processo Go in esecuzione. A volte vogliamo solo sostituire completamente il processo Go corrente con un altro (forse non-Go). Per farlo useremo l’implementazione di Go della classica funzione exec.

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

Per il nostro esempio eseguiremo ls. Go richiede un percorso assoluto al binario che vogliamo eseguire, quindi useremo exec.LookPath per trovarlo (probabilmente /bin/ls).

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

Exec richiede argomenti in forma di slice (invece di una grande stringa). Daremo a ls alcuni argomenti comuni. Nota che il primo argomento dovrebbe essere il nome del programma.

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

Exec ha anche bisogno di un set di variabili d’ambiente da usare. Qui forniamo semplicemente il nostro ambiente corrente.

    env := os.Environ()

Ecco la vera chiamata a syscall.Exec. Se questa chiamata ha successo, l’esecuzione del nostro processo finirà qui e sarà sostituita dal processo /bin/ls -a -l -h. Se c’è un errore otterremo un valore di ritorno.

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

Quando eseguiamo il nostro programma viene sostituito da ls.

$ go run esecuzione-processi.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 esecuzione-processi.go

Nota che Go non offre una funzione Unix fork classica. Di solito questo non è un problema però, dato che avviare goroutine, creare processi e eseguire processi copre la maggior parte dei casi d’uso per fork.

Prossimo esempio: .