gpt4 book ai didi

go - 在后台执行命令

转载 作者:IT王子 更新时间:2023-10-29 01:22:21 25 4
gpt4 key购买 nike

我使用以下代码执行“npm install”命令,现在在调试时我看到该命令大约需要 10..15 秒才能执行(取决于我有多少模块)。我想要的是该命令将在后台执行并且程序将继续。

cmd := exec.Command(name ,args...)
cmd.Dir = entryPath

在调试中我看到移动到下一行 tass 大约 10..15 秒...

我有两个问题:

  1. 我该怎么做?因为我想并行做一些事情...
  2. 我怎么知道它什么时候完成?要提供与此命令相关的附加逻辑,即在 npm install 完成后,我需要做其他事情。

最佳答案

虽然通常您需要 goroutines 来并行运行某些东西(或者更准确地说并发),但如果以这种方式运行外部命令或应用程序则不需要您使用 goroutines(事实上,这是多余的)。

这是因为 exec.Cmd 用于运行命令的有一个 Cmd.Start() 启动指定命令但不等待它完成的方法。所以当它在后台运行时你可以自由地做其他事情,当你需要等待它完成(并处理它的结果)时,你可以调用 Cmd.Wait() (这将阻塞并等待命令完成)。

它可能是这样的:

cmd := exec.Command("npm", "install", "other_params")
cmd.Dir = entryPath

if err := cmd.Start(); err != nil {
log.Printf("Failed to start cmd: %v", err)
return
}

// Do other stuff while cmd runs in background:
log.Println("Doing other stuff...")

// And when you need to wait for the command to finish:
if err := cmd.Wait(); err != nil {
log.Printf("Cmd returned error: %v", err)
}

对比Cmd.Start() , 有 Cmd.Run() 如果您不需要在“后台”运行它,它会启动指定的命令并等待它完成。事实上Cmd.Run()只不过是 Cmd.Start() 的链接和 Cmd.Wait()电话。

请注意,在“后台”运行时,要获取应用程序的输出,您不能调用 Cmd.Output() Cmd.CombinedOutput() 当他们运行 然后命令并获取其输出时(并且您已经 启动了命令)。如果您需要命令的输出,请将缓冲区设置为 Cmd.Stdout您可以在之后检查/使用它。

这是可以做到的:

cmd := exec.Command("npm", "install", "other_params")
cmd.Dir = entryPath
buf := &bytes.Buffer{}
cmd.Stdout = buf

if err := cmd.Start(); err != nil {
log.Printf("Failed to start cmd: %v", err)
return
}

// Do other stuff while cmd runs in background:
log.Println("Doing other stuff...")

// And when you need to wait for the command to finish:
if err := cmd.Wait(); err != nil {
log.Printf("Cmd returned error: %v", err)
// You may decide to continue or return here...
}

fmt.Println("[OUTPUT:]", buf.String())

如果您还想捕获应用程序的标准错误流,您可能/必须对 Cmd.Stderr 执行相同的操作.提示:您可以将相同的缓冲区设置为 Cmd.StdoutCmd.Stderr ,然后您将获得组合输出,这是根据文档保证的:

If Stdout and Stderr are the same writer, and have a type that can be compared with ==,
at most one goroutine at a time will call Write.

关于go - 在后台执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48557810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com