0

我有一个自动化测试,它试图通过使用以下异步 Nim 过程从本地 Git 存储库中克隆一堆特定的修订。

proc cloneSpecificRevision(downloadMethod: DownloadMethod,
                           url, downloadDir: string,
                           vcsRevision: Sha1Hash) {.async.} =
  assert vcsRevision != notSetSha1Hash
  display("Cloning", "revision: " & $vcsRevision, priority = MediumPriority)
  case downloadMethod
  of DownloadMethod.git:
    let downloadDir = downloadDir.quoteShell
    createDir(downloadDir)
    discard await tryDoCmdExAsync("git", @["-C", downloadDir, "init"])
    discard await tryDoCmdExAsync("git",
      @["-C", downloadDir, "remote", "add", "origin", url])
    discard await tryDoCmdExAsync("git",
      @["-C", downloadDir, "fetch", "--depth", "1", "origin", $vcsRevision])
    discard await tryDoCmdExAsync("git",
      @["-C", downloadDir, "reset", "--hard", "FETCH_HEAD"])
  of DownloadMethod.hg:
    discard await tryDoCmdExAsync("hg", @["clone", url, "-r", $vcsRevision])

结果是

Downloading /tmp/tlockfile/origins/dep1 using git
    Cloning revision: 8b6ce61df05f4e21ad954f9ddb487eda8fb64f41
  Executing git -C /tmp/nimble_94295/_tmptlockfileoriginsdep1_0.1.0_8b6ce61df05f4e21ad954f9ddb487eda8fb64f41 init
Downloading /tmp/tlockfile/origins/dep2 using git
    Cloning revision: d1ba2f37a1647ca1ed804dfa0c8c73a7de98201e
  Executing git -C /tmp/nimble_94295/_tmptlockfileoriginsdep2_0.1.0_d1ba2f37a1647ca1ed804dfa0c8c73a7de98201e init
    Error:  Resource temporarily unavailable (code: 11)

使用的 Git 版本是:

> git --version
git version 2.31.1

该问题仅发生在 Linux 上,我的测试在 Windows 和 macOS 系统上正常通过。这个问题的原因是什么?

4

1 回答 1

1

Linux 上的错误 11 是EAGAIN, Resource temporarily unavailable. Linuxfork系统调用可能会产生此错误,因为目前没有足够的资源

什么是资源?它们有很多,但其中一个是内存,另一个是进程。两者都可以“暂时”用完,因为程序(进程)运行了一段时间,然后退出;当他们退出时,他们会释放他们正在使用的资源。另请参阅Fork 失败并显示“资源暂时不可用”。哪个资源?, OSError: [Errno 11] 资源暂时不可用。这是什么原因造成的?, 和fork() 因内存不足错误而失败(请注意,最后一个显示 errno 12, ENOMEM,但您可以EAGAIN在此处访问其他类 Unix 系统,因此即使您特别提到了 Linux,我也将其包括在内)。

请注意,这与 Git 本身无关:如果您使用 达到了进程限制,那么在子进程中返回后fork打算运行什么都无关紧要。fork

于 2021-07-19T02:25:35.040 回答