nohup回到golang的程序

时间:2015-11-26 07:10:34

标签: go nohup

我们正在尝试从golang中执行nohup脚本,这是我们执行的命令

cmd := exec.Command("nohup","sh",destinationDirPath + "/pf_file_monitor.sh","&>",destinationDirPath + "/nohup.out","&")
_,err = cmd.Output();

问题是在排除此命令后,控件没有返回程序。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

所以似乎有一些东西正在绊倒。我已经重写了下面的代码,但让我首先明确地解决每一个问题,这样我就能解释一下我认为的困惑并解释我的变化:

  • destinationDirPath + "/pf_file_monitor.sh" - 这在技术上不是错误的,但使用filepath.Join更加惯用(更可靠);作为一般规则,除非你有充分的理由,否则你永远不应该做路径的手动字符串连接
  • $> - 我假设你在这里尝试做的是将命令的输出重定向到日志文件。这里的问题是,只有当您在shell中时,符号$>才有意义(例如shbash)。另一方面,Go只是将其视为另一个命令行参数,并将其作为参数传递给程序。因此,您将不得不手动执行此操作。在下面给出的示例中,我所做的是打开文件然后将cmd的stdout和stderr管道(这些是控制stdout和stderr去的io.Writer)设置到文件句柄
  • 它不会在后台运行。这里的问题是你正在使用Run方法,它将运行命令并阻塞直到它完成。您需要Start方法,该方法仅启动命令然后立即返回,以便您的程序可以继续运行。

希望这有帮助!这是更新后的实现:

script := filepath.Join(destinationDirPath, "pf_file_monitor.sh")
log := filepath.Join(destinationDirPath, "nohup.out")
cmd := exec.Command("nohup", "sh", script)

f, err := os.Create(log)
if err != nil {
    // handle error
}

// redirect both stdout and stderr to the log file
cmd.Stdout = f
cmd.Stderr = f

// start command (and let it run in the background)
err = cmd.Start()
if err != nil {
    // handle error
}