无效的id:处理泄露的文件描述符。詹金斯

时间:2014-03-26 12:03:40

标签: windows git github jenkins jenkins-plugins

我已经设置了一个Jenkins CI解决方案(在Windows上),该解决方案包含3个并行作业(使用Multijob插件),可以将git存储库(使用Git-plugin)签出到各自的工作区中。 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)

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

如果您要检查link given in your error message,您会找到三个解决此问题的详细示例解决方法,

  1. 'at' command可用于在后台启动流程。
  2. 使用包装器脚本并通过它启动程序。
  3. 对于Windows XP及更高版本,将安排永久任务和强制 从蚂蚁脚本中运行它。
  4. 编辑:

    描述了此问题的原因,

      

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

         

    当继承那些文件描述符时会发生并发症   其他过程。让我们说子进程分叉另一个进程   的背景。后台进程(AKA守护进程)继承了所有   父文件的描述符,包括写的一面   用于连接子进程和Jenkins的stdout / stderr管道。如果   守护进程忘记关闭它们,詹金斯甚至没有获得管道的EOF   当子进程退出时,因为守护进程仍然有那些进程   描述符打开。这就是这个问题发生的原因。

         

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

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