猿问

为什么此代码在运行命令时出错 error="exec: not started"`?

这是我的代码(writeFromProcessToFileWithMax是一个内部函数,并且工作正常):


    // Go routines for non-blocking reading of stdout and stderr and writing to files

    g := new(errgroup.Group)


    // Read stdout in goroutine.

    g.Go(func() error {

        err = writeFromProcessToFileWithMax(stdoutScanner, stdoutFileWriter, maxStdoutFileLengthInGB)

        if err != nil {

            log.Error().Err(err).Msgf("Error writing to stdout file: %s", stdoutFilename)

            return err

        }

        return nil

    })


    // Read stderr in goroutine.

    g.Go(func() error {

        err = writeFromProcessToFileWithMax(stderrScanner, stderrFileWriter, maxStderrFileLengthInGB)

        if err != nil {

            log.Error().Err(err).Msgf("Error writing to stderr file: %s", stderrFilename)

            return err

        }

        return nil

    })


    // Wait the command in a goroutine.

    g.Go(func() error {

        return cmd.Wait()

    })


    // Starting the command

    if err = cmd.Start(); err != nil {

        log.Error().Err(err).Msg("Error starting command")

        return err

    }


    // Waiting until errorGroups groups are done

    if err = g.Wait(); err != nil {

        log.Error().Err(err).Msg("Error during running of the command")

    }


当我运行它时,我得到以下 Error = Error during running of the command error="exec: not started"。但一切正常。


它会回来咬我还是我应该压制?


吃鸡游戏
浏览 142回答 1
1回答

一只萌萌小番薯

cmd在你开始之前你正在等待。在您的旧代码中的大部分时间cmd.Wait()之前都会被调用。(无法保证两个不同的 goroutine 中的事情何时发生,除非您明确使用同步点)cmd.Start()交换goroutine的顺序cmd.Start()和内部:cmd.Wait()// Starting the commandif err = cmd.Start(); err != nil {    log.Error().Err(err).Msg("Error starting command")    return err}// Wait the command in a goroutine.g.Go(func() error {    return cmd.Wait()})当您启动在启动命令后等待的 goroutine 时,您可以保证以cmd.Start()正确cmd.Wait()的顺序执行。至于为什么它似乎有效:g.Wait()“阻塞直到 Go 方法的所有函数调用都返回,然后从它们返回第一个非零错误(如果有的话)。 ”所以所有的 go 例程都完成了,包括复制输出的例程,然后您会看到执行cmd.Wait().
随时随地看视频慕课网APP

相关分类

Go
我要回答