【问题标题】:Invalid id: Process leaked file descriptors. Jenkins无效的 id:处理泄漏的文件描述符。詹金斯
【发布时间】:2014-03-26 12:03:39
【问题描述】:

我已经设置了一个 Jenkins CI 解决方案(在 Windows 上),其中包含 3 个并行作业(使用 Multijob 插件),它们将 git 存储库(使用 Git 插件)签入到各自的工作区中。 95% 的情况下,作业运行良好,但有时我会在一项或多项作业中收到以下错误消息:

Building on master in workspace C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace
Checkout:workspace / C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace - hudson.remoting.LocalChannel@1a046fe
Using strategy: Gerrit Trigger
Last Built Revision: Revision 2ff5e3449041916e21fe7a4833a2babcfef45225 (master)
Fetching changes from 1 remote Git repository
Fetching upstream changes from origin
Commencing build of Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Checking out Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master)
Cleaning workspace
Resetting working tree
FATAL: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
java.lang.IllegalArgumentException: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
    at org.eclipse.jgit.lib.ObjectId.fromString(ObjectId.java:232)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.doRevList(CliGitAPIImpl.java:1278)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.revList(CliGitAPIImpl.java:1264)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.isCommitInRepo(CliGitAPIImpl.java:1289)
    at hudson.plugins.git.GitAPI.isCommitInRepo(GitAPI.java:189)
    at hudson.plugins.git.GitSCM.computeChangeLog(GitSCM.java:1286)
    at hudson.plugins.git.GitSCM.access$1300(GitSCM.java:57)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1251)
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1205)
    at hudson.FilePath.act(FilePath.java:905)
    at hudson.FilePath.act(FilePath.java:878)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1205)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1369)
    at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676)
    at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581)
    at hudson.model.Run.execute(Run.java:1593)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:242)

谁能帮我解决这个问题?

【问题讨论】:

    标签: windows git github jenkins jenkins-plugins


    【解决方案1】:

    如果您查看link given in your error message,您会发现三个解决方法以及解决此问题的详细示例,

    1. 'at' command 可用于在后台启动进程。
    2. 使用包装脚本并通过它启动您的程序。
    3. 对于 Windows XP 及更高版本是计划永久任务和强制 从 ant 脚本运行它。

    编辑:

    描述了这个问题的原因,

    Jenkins和子进程通过三个管道连接 (stdin/stdout/stderr.) 这允许 Jenkins 捕获来自 子进程。由于子进程可能会写入大量数据到 管道并在此之后立即退出,詹金斯需要确保 它在认为构建结束之前排干了管道。 Jenkins 通过等待 EOF 来做到这一点。

    当这些文件描述符被继承到 其他过程。假设子进程分叉另一个进程 的背景。后台进程(AKA 守护进程)继承所有 父文件描述符,包括 连接子进程和 Jenkins 的 stdout/stderr 管道。如果 守护进程忘记关闭它们,Jenkins 甚至不会为管道获取 EOF 当子进程退出时,因为守护进程仍然有那些 描述符打开。这就是问题发生的原因。

    一个好的守护程序会关闭所有文件描述符以避免这样的问题(这样jenkins可以读取EOF)

    为防止守护程序打开文件描述符,一个进程(这是您的解决方法,可以是后台运行的 shell/windows 脚本)将在后台运行,以确保当守护程序存在时,它会关闭所有文件描述符。

    【讨论】:

    • 问题是在构建步骤触发之前就失败了
    • @ruslo 这个变通办法不是詹金斯构建步骤的一部分!!!看看吧……
    • 可能是我遗漏了什么,但引用文档:You can call your command。我没有任何命令,即使我有一个刚刚退出并显示 SUCCESS 消息的裸项目也会出现问题(至少它必须)
    • @ruslo 您可以查看已编辑的答案以获取更多描述。但是“您可以调用您的命令”适用于 unix,这超出了范围,因为这个问题适用于 windows。 :)
    • 您引用文档很好,尽管我已经这样做了))但我不明白如何进行修复。 while daemon exists 什么守护进程?我没有运行任何程序。
    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 2023-01-24
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多