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

时间:2017-03-22 22:12:10

标签: 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")

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

No rules

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

2 个答案:

答案 0 :(得分:8)

syscall.Exec invokes execve(2),它在linux上不会向调用者返回执行,而是replaces当前(Go)进程调用该进程。

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

答案 1 :(得分:2)

正如@mkopriva所提到的,你可能想要exec.Cmd

这是一个例子:

cmd := exec.Command("auditctl", "-D")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = os.Environ()
if err := cmd.Run(); err != nil {
    log.Println("Failed to run auditctl:",err)
} 
相关问题