2016-10-24 1 views
0

私のルーチンは、同じgo実行可能バイナリ(os.Args [0])から10個の子プロセスを有効にするいくつかのコマンドライン引数を追加しています。すべてのプロセスは、引数の1つに指定された秒数の間存続する必要があります。上記を実行するとexec.Commandから発行されたOSレベルでコマンド引数を見ることができません

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") 
} 

は、OSレベルで見ている私は、引数が行われていない見ることができます。ルートプロセスだけが私がタイプした引数を持っています:

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

bashで直接 'os.Args [0]'を呼び出す理由は何ですか? – nothingmuch

答えて

3

-c bashフラグは、解釈するために単一の文字列引数をとります。 -cへの引数は文字列os.Args[0]であるため、すべてのbashが実行され、残りのargsは無視されます。

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() 
} 

それとも単に余分なシェルなしで直接あなたのバイナリをexecし:単一の文字列にそれらを結合、bash -cによって実行されるように、あなたのバイナリに引数を提供するために、

関連する問題