nohup 回到 golang 编程

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

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

问题是在执行此命令后,控制权没有返回到程序。

任何人都可以帮助我吗?


慕村9548890
浏览 400回答 1
1回答

慕妹3242003

所以似乎有一些事情正在绊倒。我已经重写了下面的代码,但让我首先明确地解决每个问题,以便我可以解释我认为的混淆是什么并解释我的更改:destinationDirPath + "/pf_file_monitor.sh"- 这在技术上没有错,但使用起来更惯用(也更可靠)filepath.Join;作为一般规则,除非有充分的理由,否则永远不应该对路径进行手动字符串连接$>- 我假设您在这里尝试做的是将命令的输出重定向到日志文件。这里的问题是该符号$>仅在您处于 shell 中时才有意义(例如sh或bash)。另一方面,Go 只是将其视为另一个命令行参数,并将其作为参数传递给程序。因此,您将不得不手动执行此操作。在我下面给出的示例中,我所做的是打开文件,然后将cmd的 stdout 和 stderr 管道(这些是io.Writer控制 stdout 和 stderr 去向的 s )设置为文件句柄。它不会在后台运行。这里的问题是您正在使用该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 filecmd.Stdout = fcmd.Stderr = f// start command (and let it run in the background)err = cmd.Start()if err != nil {    // handle error}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go