为了账号安全,请及时绑定邮箱和手机立即绑定

nohup 回到 golang 编程

nohup 回到 golang 编程

Go
慕村9548890 2021-11-22 19:34:42
我们正在尝试从 golang 执行 nohup 脚本,这是我们执行的命令cmd := exec.Command("nohup","sh",destinationDirPath + "/pf_file_monitor.sh","&>",destinationDirPath + "/nohup.out","&")_,err = cmd.Output();问题是在执行此命令后,控制权没有返回到程序。任何人都可以帮助我吗?
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

所以似乎有一些事情正在绊倒。我已经重写了下面的代码,但让我首先明确地解决每个问题,以便我可以解释我认为的混淆是什么并解释我的更改:

  • destinationDirPath + "/pf_file_monitor.sh"- 这在技术上没有错,但使用起来更惯用(也更可靠)filepath.Join;作为一般规则,除非有充分的理由,否则永远不应该对路径进行手动字符串连接

  • $>- 我假设您在这里尝试做的是将命令的输出重定向到日志文件。这里的问题是该符号$>仅在您处于 shell 中时才有意义(例如shbash)。另一方面,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 file

cmd.Stdout = f

cmd.Stderr = f


// start command (and let it run in the background)

err = cmd.Start()

if err != nil {

    // handle error

}


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信