无法在exec.Command发出的操作系统级别查看命令参数

时间:2016-10-24 15:32:59

标签: go

我的例程应该从相同的可执行二进制文件(os.Args [0])中旋转10个子进程,添加一些有效的命令行参数。所有进程都应该存在若干秒,这在一个参数中指定。

func spinChildProcesses() {
    cmdParts := make([]string, 4)
    cmdParts[0] = "-c"
    cmdParts[1] = os.Args[0]
    cmdParts[2] = "--duration"
    cmdParts[3] = "10000"
    for i := 0; i < 10; i++ {
        proc := exec.Command("bash", cmdParts...)
        go proc.Start()
    }
}

func main() {
    # not showing code that parses duration arg
    # create 10 child subprocesses
    go spinChildProcesses()
    // set a duration to the process and terminate
    time.Sleep(time.Second * time.Duration(duration))
    fmt.Println(" - process terminating normaly")
}

当运行上述操作时,查看操作系统级别,我可以看到参数未执行。只有根进程具有我键入的参数:

ps -ef | grep my-test-pr
root      3806 14446  0 15:23 pts/1    00:00:00 ./my-test-pr --duration 10000
root      3810  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3811  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3813  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3814  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3818  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3823  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3824  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3829  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3836  3806  0 15:23 pts/1    00:00:00 ./my-test-pr
root      3840  3806  0 15:23 pts/1    00:00:00 ./my-test-pr

知道为什么以及如何确保将参数传递给子进程?

1 个答案:

答案 0 :(得分:3)

-c bash标志需要一个字符串参数来解释。由于-c的参数只是字符串os.Args[0],所以bash正在执行,而其余的args被忽略。

要提供由bash -c执行的二进制文件的参数,请将它们连接成一个字符串:

var args []string
args = append(args, os.Args[0])
args = append(args, "--duration")
args = append(args, "10000")
for i := 0; i < 10; i++ {
    proc := exec.Command("/bin/bash", "-c", stringsJoin(args, " "))
    go proc.Start()
}

或者直接执行你的二进制文件而不需要额外的shell。