golang程序在调用linux shell命令后终止

drd*_*dot 3 linux shell go

我正在使用root权限执行以下golang程序(代码段):

  binary, lookErr := exec.LookPath("auditctl")
  if lookErr != nil {
    panic(lookErr)
  }
  env := os.Environ()

  args :=  []string{"auditctl", "-D"}
  execErr := syscall.Exec(binary, args, env)
  if execErr != nil {
    fmt.Println("error")
    panic(execErr)
  }

  fmt.Println("no error")
Run Code Online (Sandbox Code Playgroud)

因为我在系统中没有任何auditctl规则,该命令在终端中打印以下内容.这就像我直接输入shell时一样正常.

No rules
Run Code Online (Sandbox Code Playgroud)

除了不打印"错误"和"无错误".这意味着golang程序在syscall.Exec之后立即终止.这是怎么发生的?如何在syscall.Exec之后继续执行,因为我还有其他东西要在同一个程序中运行.

Joh*_*don 8

syscall.Exec 调用execve(2),在linux上不会将执行返回给调用者,而是调用的进程替换当前(Go)进程.

正如David Budworth和mkopriva建议的那样..如果你真的想要产生一个单独的进程并在产生后返回你的Go代码; 考虑使用exec.Command