Goによる演習: プロセス実行

以前の演習では外部プロセスの生成について検討しました。これは、実行中のGoプロセスでアクセス可能な外部プロセスが必要な場合に行います。場合によっては、現在の実行中のGoプロセスを別の(おそらく非Go)プロセスに完全に置き換えるだけでよいでしょう。これを実行するには、クラシックexec関数のGoの実装を使用します。

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には、スライス形式の引数が必要です(1つの大きな文字列とは異なり)。ここでは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)
    }
}

プログラムを実行すると、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関数は提供されないことに注意してください。通常、これは問題ではありません。なぜなら、goroutineの開始、プロセスの生成、プロセスの実行により、forkのほとんどのユースケースがカバーされるからです。

次の演習: シグナル